@@ -144,25 +144,39 @@ def _render_pyproject_toml(additional_data: AdditionalData) -> str:
144144
145145
146146def _transform_types (parsed_idl : ParsedIDL ) -> ParsedIDL :
147+ defined_types = set ()
148+
149+ for struct_name in parsed_idl ["structs" ]:
150+ defined_types .add (struct_name )
151+
152+ for enum_name in parsed_idl ["enums" ]:
153+ defined_types .add (enum_name )
154+
155+ for typedef_name in parsed_idl ["typedefs" ]:
156+ defined_types .add (typedef_name )
157+
147158 for struct_name , struct_data in parsed_idl ["structs" ].items ():
148159 for member_data in struct_data ["members" ].values ():
149- member_data ["type" ] = _transformer (member_data ["type" ], parsed_idl ["inheritance_data" ])
160+ member_data ["type" ] = _transformer (member_data ["type" ], parsed_idl ["inheritance_data" ], defined_types )
150161
151162 if member_data ["default" ] == "{}" and member_data ["default_type" ] is not None :
152163 # member_data["default"] = f"Field(default={member_data['default_type']}())"
153164 member_data ["default" ] = f"{ member_data ['default_type' ]} ()"
154165
155166 if member_data ["default" ] == "{}" and member_data ["default_type" ] is None :
156167 # member_data["default"] = f"Field(default={member_data['type']}())"
157- member_data ["default" ] = f"{ member_data ['type' ]} ()"
168+ type_str = member_data ["type" ]
169+ if isinstance (type_str , str ) and type_str .startswith ('"' ) and type_str .endswith ('"' ):
170+ type_str = type_str [1 :- 1 ]
171+ member_data ["default" ] = f"{ type_str } ()"
158172
159173 if not member_data ["required" ] and member_data ["default" ] is None :
160174 member_data ["type" ] = f"Optional[{ member_data ['type' ]} ]"
161175
162176 if "str" in member_data ["type" ] and member_data ["default" ] is not None :
163177 member_data ["default" ] = f'"{ member_data ["default" ]} "'
164178
165- if member_data ["default" ] is None :
179+ if member_data ["default" ] is None and member_data [ "required" ] is False :
166180 member_data ["default" ] = "None"
167181
168182 # Check if a member named "type" is already present in the struct and raise an error if so
@@ -186,14 +200,14 @@ def _transform_types(parsed_idl: ParsedIDL) -> ParsedIDL:
186200 }
187201
188202 for type_def in parsed_idl ["typedefs" ].values ():
189- type_def ["type" ] = _transformer (type_def ["type" ], parsed_idl ["inheritance_data" ])
203+ type_def ["type" ] = _transformer (type_def ["type" ], parsed_idl ["inheritance_data" ], defined_types )
190204
191205 return parsed_idl
192206
193207
194- def _transformer (type_input : dict [str , Any ], inheritance_data : dict [str , list [str ]]) -> str :
208+ def _transformer (type_input : dict [str , Any ], inheritance_data : dict [str , list [str ]], defined_types : set [ str ] ) -> str :
195209 if isinstance (type_input , str ):
196- type_input = _get_polymorphic_type (type_input , inheritance_data )
210+ type_input_poly = _get_polymorphic_type (type_input , inheritance_data , defined_types )
197211
198212 conversion = {
199213 "string" : "str" ,
@@ -214,14 +228,20 @@ def _transformer(type_input: dict[str, Any], inheritance_data: dict[str, list[st
214228 "unsigned long long" : "int" ,
215229 }
216230
217- return conversion .get (type_input , type_input )
231+ # check if type_input is in defined_types
232+ if type_input_poly in defined_types :
233+ return f'"{ conversion .get (type_input_poly , type_input_poly )} "'
234+
235+ return conversion .get (type_input_poly , type_input_poly )
218236
219237 if type_input ["union" ]:
220- contained_types = [_transformer (contained , inheritance_data ) for contained in type_input ["type_name" ]]
238+ contained_types = [
239+ _transformer (contained , inheritance_data , defined_types ) for contained in type_input ["type_name" ]
240+ ]
221241 transformed_type = "," .join (contained_types )
222242 return f"Union[{ transformed_type } ]"
223243 if type_input ["vector" ]:
224- transformed_type = _transformer (type_input ["type_name" ], inheritance_data )
244+ transformed_type = _transformer (type_input ["type_name" ], inheritance_data , defined_types )
225245
226246 if type_input ["size" ] is not None :
227247 return (
@@ -232,17 +252,17 @@ def _transformer(type_input: dict[str, Any], inheritance_data: dict[str, list[st
232252
233253 return f"List[{ transformed_type } ]"
234254 if type_input ["map" ]:
235- key_type = _transformer (type_input ["type_name" ]["key" ], inheritance_data )
255+ key_type = _transformer (type_input ["type_name" ]["key" ], inheritance_data , defined_types )
236256 # TODO: here we can check if the type changed??
237257
238- value_type = _transformer (type_input ["type_name" ]["value" ], inheritance_data )
258+ value_type = _transformer (type_input ["type_name" ]["value" ], inheritance_data , defined_types )
239259 return f"Dict[{ key_type } , { value_type } ]"
240260
241261 msg = f"Unknown type: { type_input } "
242262 raise ValueError (msg )
243263
244264
245- def _get_polymorphic_type (type_input : str , inheritance_data : dict [str , list [str ]]) -> str :
265+ def _get_polymorphic_type (type_input : str , inheritance_data : dict [str , list [str ]], defined_types : set [ str ] ) -> str :
246266 union_content = []
247267
248268 if type_input in inheritance_data :
@@ -255,6 +275,7 @@ def _get_polymorphic_type(type_input: str, inheritance_data: dict[str, list[str]
255275 union_content .append (base_type )
256276
257277 if union_content :
278+ union_content = [f'"{ type_name } "' for type_name in union_content if type_name in defined_types ]
258279 return f"Annotated[Union[{ ', ' .join (union_content )} ],Field(discriminator=\" type\" )]"
259280
260281 return type_input
0 commit comments