Skip to content

Commit

Permalink
feat(ts-bindgen): remove fieldOrder in ts bindgen (#3024)
Browse files Browse the repository at this point in the history
  • Loading branch information
MartianGreed authored Feb 13, 2025
1 parent c60392a commit 5e1f3b9
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,3 @@ pub(crate) const CAIRO_OPTION_TYPE_PATH: &str = "core::option::Option";
pub(crate) const SN_IMPORT_SEARCH: &str = "} from 'starknet';";
pub(crate) const CAIRO_OPTION_TOKEN: &str = "CairoOption, CairoOptionVariant,";
pub(crate) const CAIRO_ENUM_TOKEN: &str = "CairoCustomEnum,";

pub(crate) const WITH_FIELD_ORDER_TYPE_DEF: &str =
"type WithFieldOrder<T> = T & { fieldOrder: string[] };\n";
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use cainome::parser::tokens::{Composite, CompositeType, Token};

use super::constants::{
BIGNUMNERISH_IMPORT, CAIRO_OPTION_IMPORT, SN_IMPORT_SEARCH, WITH_FIELD_ORDER_TYPE_DEF,
};
use super::constants::{BIGNUMNERISH_IMPORT, CAIRO_OPTION_IMPORT, SN_IMPORT_SEARCH};
use super::{token_is_option, JsPrimitiveType};
use crate::error::BindgenResult;
use crate::plugins::typescript::generator::constants::CAIRO_OPTION_TOKEN;
Expand All @@ -27,12 +25,6 @@ impl TsInterfaceGenerator {
}
}
}

fn add_input_type(&self, buffer: &mut Buffer) {
if !buffer.has(WITH_FIELD_ORDER_TYPE_DEF) {
buffer.push(WITH_FIELD_ORDER_TYPE_DEF.to_owned());
}
}
}

impl BindgenModelGenerator for TsInterfaceGenerator {
Expand All @@ -47,7 +39,6 @@ impl BindgenModelGenerator for TsInterfaceGenerator {
}

self.check_import(token, buffer);
self.add_input_type(buffer);

Ok(format!(
"// Type definition for `{path}` struct
Expand Down
4 changes: 1 addition & 3 deletions crates/dojo/bindgen/src/plugins/typescript/generator/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@ pub(crate) fn get_namespace_and_path(token: &Composite) -> (String, String, Stri
/// Generates default values for each fields of the struct.
pub(crate) fn generate_type_init(token: &Composite) -> String {
format!(
"{{\n\t\t\tfieldOrder: [{}],\n{}\n\t\t}}",
token.inners.iter().map(|i| format!("'{}'", i.name)).collect::<Vec<String>>().join(", "),
"{{\n{}\n\t\t}}",
token
.inners
.iter()
Expand Down Expand Up @@ -809,7 +808,6 @@ mod tests {
// the content of generate_type_init is wrapped in a function that adds brackets before and
// after
let expected = "{
\t\t\tfieldOrder: ['field1', 'field2', 'field3'],
\t\t\tfield1: 0,
\t\t\tfield2: 0,
\t\t\tfield3: 0,
Expand Down
56 changes: 22 additions & 34 deletions crates/dojo/bindgen/src/plugins/typescript/generator/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,22 @@ impl TsSchemaGenerator {
let schema_type = "export interface SchemaType extends ISchemaType";
if !buffer.has(schema_type) {
buffer.push(format!(
"export interface SchemaType extends ISchemaType {{\n\t{ns}: {{\n\t\t{}: \
WithFieldOrder<{}>,\n\t}},\n}}",
type_name, type_name
"export interface SchemaType extends ISchemaType {{\n\t{ns}: {{\n\t\t{type_name}: \
{type_name},\n\t}},\n}}",
));
return;
}

// check if namespace is defined in interface. if not, add it.
// next, find where namespace was defined in interface and add property to it.
if !self.namespace_is_defined(buffer, &ns) {
let gen = format!("\n\t{ns}: {{\n\t\t{type_name}: WithFieldOrder<{type_name}>,\n\t}},");
let gen = format!("\n\t{ns}: {{\n\t\t{type_name}: {type_name},\n\t}},");
buffer.insert_after(gen, schema_type, ",", 1);
return;
}

// type has already been initialized
let gen = format!("\n\t\t{type_name}: WithFieldOrder<{type_name}>,");
let gen = format!("\n\t\t{type_name}: {type_name},");
if buffer.has(&gen) {
return;
}
Expand Down Expand Up @@ -171,7 +170,7 @@ mod tests {
let _result = generator.generate(&token, &mut buffer);
assert_eq!(
"export interface SchemaType extends ISchemaType {\n\tonchain_dash: \
{\n\t\tTestStruct: WithFieldOrder<TestStruct>,\n\t},\n}",
{\n\t\tTestStruct: TestStruct,\n\t},\n}",
buffer[1]
);
}
Expand All @@ -187,34 +186,31 @@ mod tests {
assert_ne!(0, buffer.len());
assert_eq!(
"export interface SchemaType extends ISchemaType {\n\tonchain_dash: \
{\n\t\tTestStruct: WithFieldOrder<TestStruct>,\n\t},\n}",
{\n\t\tTestStruct: TestStruct,\n\t},\n}",
buffer[0]
);

let token_2 = create_test_struct_token("AvailableTheme", "onchain_dash");
generator.handle_schema_type(&token_2, &mut buffer);
assert_eq!(
"export interface SchemaType extends ISchemaType {\n\tonchain_dash: \
{\n\t\tTestStruct: WithFieldOrder<TestStruct>,\n\t\tAvailableTheme: \
WithFieldOrder<AvailableTheme>,\n\t},\n}",
{\n\t\tTestStruct: TestStruct,\n\t\tAvailableTheme: AvailableTheme,\n\t},\n}",
buffer[0]
);
let token_3 = create_test_struct_token("Player", "combat");
generator.handle_schema_type(&token_3, &mut buffer);
assert_eq!(
"export interface SchemaType extends ISchemaType {\n\tonchain_dash: \
{\n\t\tTestStruct: WithFieldOrder<TestStruct>,\n\t\tAvailableTheme: \
WithFieldOrder<AvailableTheme>,\n\t},\n\tcombat: {\n\t\tPlayer: \
WithFieldOrder<Player>,\n\t},\n}",
{\n\t\tTestStruct: TestStruct,\n\t\tAvailableTheme: AvailableTheme,\n\t},\n\tcombat: \
{\n\t\tPlayer: Player,\n\t},\n}",
buffer[0]
);
let token_4 = create_test_struct_token("Position", "combat");
generator.handle_schema_type(&token_4, &mut buffer);
assert_eq!(
"export interface SchemaType extends ISchemaType {\n\tonchain_dash: \
{\n\t\tTestStruct: WithFieldOrder<TestStruct>,\n\t\tAvailableTheme: \
WithFieldOrder<AvailableTheme>,\n\t},\n\tcombat: {\n\t\tPlayer: \
WithFieldOrder<Player>,\n\t\tPosition: WithFieldOrder<Position>,\n\t},\n}",
{\n\t\tTestStruct: TestStruct,\n\t\tAvailableTheme: AvailableTheme,\n\t},\n\tcombat: \
{\n\t\tPlayer: Player,\n\t\tPosition: Position,\n\t},\n}",
buffer[0]
);
}
Expand All @@ -230,8 +226,7 @@ mod tests {
assert_eq!(
buffer[0],
"export const schema: SchemaType = {\n\tonchain_dash: {\n\t\tTestStruct: \
{\n\t\t\tfieldOrder: ['field1', 'field2', 'field3'],\n\t\t\tfield1: \
0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t},\n};"
{\n\t\t\tfield1: 0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t},\n};"
);

let token_2 = create_test_struct_token("AvailableTheme", "onchain_dash");
Expand All @@ -240,10 +235,8 @@ mod tests {
assert_eq!(
buffer[0],
"export const schema: SchemaType = {\n\tonchain_dash: {\n\t\tTestStruct: \
{\n\t\t\tfieldOrder: ['field1', 'field2', 'field3'],\n\t\t\tfield1: \
0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t\tAvailableTheme: \
{\n\t\t\tfieldOrder: ['field1', 'field2', 'field3'],\n\t\t\tfield1: \
0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t},\n};"
{\n\t\t\tfield1: 0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t\tAvailableTheme: \
{\n\t\t\tfield1: 0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t},\n};"
);

let token_3 = create_test_struct_token("Player", "combat");
Expand All @@ -252,12 +245,10 @@ mod tests {
assert_eq!(
buffer[0],
"export const schema: SchemaType = {\n\tonchain_dash: {\n\t\tTestStruct: \
{\n\t\t\tfieldOrder: ['field1', 'field2', 'field3'],\n\t\t\tfield1: \
0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t\tAvailableTheme: \
{\n\t\t\tfieldOrder: ['field1', 'field2', 'field3'],\n\t\t\tfield1: \
0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t},\n\tcombat: {\n\t\tPlayer: \
{\n\t\t\tfieldOrder: ['field1', 'field2', 'field3'],\n\t\t\tfield1: \
0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t},\n};"
{\n\t\t\tfield1: 0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t\tAvailableTheme: \
{\n\t\t\tfield1: 0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t},\n\tcombat: \
{\n\t\tPlayer: {\n\t\t\tfield1: 0,\n\t\t\tfield2: 0,\n\t\t\tfield3: \
0,\n\t\t},\n\t},\n};"
);

let token_4 = create_test_struct_token("Position", "combat");
Expand All @@ -266,13 +257,10 @@ mod tests {
assert_eq!(
buffer[0],
"export const schema: SchemaType = {\n\tonchain_dash: {\n\t\tTestStruct: \
{\n\t\t\tfieldOrder: ['field1', 'field2', 'field3'],\n\t\t\tfield1: \
0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t\tAvailableTheme: \
{\n\t\t\tfieldOrder: ['field1', 'field2', 'field3'],\n\t\t\tfield1: \
0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t},\n\tcombat: {\n\t\tPlayer: \
{\n\t\t\tfieldOrder: ['field1', 'field2', 'field3'],\n\t\t\tfield1: \
0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t\tPosition: {\n\t\t\tfieldOrder: \
['field1', 'field2', 'field3'],\n\t\t\tfield1: 0,\n\t\t\tfield2: 0,\n\t\t\tfield3: \
{\n\t\t\tfield1: 0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t\tAvailableTheme: \
{\n\t\t\tfield1: 0,\n\t\t\tfield2: 0,\n\t\t\tfield3: 0,\n\t\t},\n\t},\n\tcombat: \
{\n\t\tPlayer: {\n\t\t\tfield1: 0,\n\t\t\tfield2: 0,\n\t\t\tfield3: \
0,\n\t\t},\n\t\tPosition: {\n\t\t\tfield1: 0,\n\t\t\tfield2: 0,\n\t\t\tfield3: \
0,\n\t\t},\n\t},\n};"
);
}
Expand Down

0 comments on commit 5e1f3b9

Please sign in to comment.