@@ -81,6 +81,7 @@ struct SDFAttribute {
8181 required : RequiredStatus ,
8282 default : Option < String > ,
8383 description : String ,
84+ reference : Option < String > ,
8485}
8586
8687impl SDFAttribute {
@@ -91,6 +92,7 @@ impl SDFAttribute {
9192 required : RequiredStatus :: Optional ,
9293 default : None ,
9394 description : "" . to_string ( ) ,
95+ reference : None ,
9496 }
9597 }
9698 fn get_field_string ( & self ) -> String {
@@ -130,6 +132,7 @@ impl SDFElement {
130132 required : RequiredStatus :: Optional ,
131133 default : None ,
132134 description : "" . to_string ( ) ,
135+ reference : None ,
133136 } ,
134137 child_elems : vec ! [ ] ,
135138 child_attrs : vec ! [ ] ,
@@ -160,25 +163,26 @@ impl SDFElement {
160163 }
161164 out += "#[derive(Default, PartialEq, Clone, Debug, YaSerialize, YaDeserialize)]\n " ;
162165 out += format ! ( "#[yaserde(rename = \" {}\" )]\n " , self . properties. name) . as_str ( ) ;
163- if self . top_level {
164- out += format ! ( "pub struct {}{} {{\n " , prefix_type( prefix) , self . typename( ) ) . as_str ( ) ;
165- } else {
166- out += format ! (
167- "pub struct {}{} {{\n " ,
168- prefix_type( prefix) ,
169- self . properties. name. to_case( Case :: Pascal )
170- )
171- . as_str ( ) ;
172- }
166+ out += format ! ( "pub struct {}{} {{\n " , prefix_type( prefix) , self . typename( ) ) . as_str ( ) ;
173167 for child in & self . child_attrs {
174168 out += child. get_field_string ( ) . as_str ( ) ;
175169 }
176170
177171 let mut child_gen = "" . to_string ( ) ;
178- let name = prefix. to_string ( ) . to_case ( Case :: Pascal ) + self . properties . name . as_str ( ) ;
172+ let name = prefix. to_string ( ) . to_case ( Case :: Pascal ) + self . typename ( ) . as_str ( ) ;
179173 for child in & self . child_elems {
180174 if child. properties . rtype . is_empty ( ) {
181175 // TODO(arjo): Handle includes
176+ if let Some ( reference) = & child. properties . reference {
177+ out += format ! (
178+ " #[yaserde(child, rename = \" {}\" )]\n pub {}: Vec<Boxed<Sdf{}>>,\n " ,
179+ reference,
180+ reference,
181+ self . typename( )
182+ )
183+ . as_str ( ) ;
184+ continue ;
185+ }
182186 let prefix = prefix_type ( & name) ;
183187 child_gen += child. code_gen ( prefix. as_str ( ) , file_map) . as_str ( ) ;
184188 let typename = prefix + child. properties . name . to_case ( Case :: Pascal ) . as_str ( ) ;
@@ -251,6 +255,9 @@ fn parse_element(model: &mut SDFElement, element: &Element) {
251255 if let Some ( required) = element. attributes . get ( "required" ) {
252256 model. properties . required = RequiredStatus :: from_str ( required) ;
253257 }
258+ if let Some ( reference) = element. attributes . get ( "ref" ) {
259+ model. properties . reference = Some ( reference. clone ( ) ) ;
260+ }
254261 } else if element. name == "attribute" {
255262 let mut attr = SDFAttribute :: new ( ) ;
256263 // Parse element description
@@ -282,12 +289,9 @@ fn parse_element(model: &mut SDFElement, element: &Element) {
282289 if el. name == "attribute" {
283290 parse_element ( model, el) ;
284291 } else if el. name == "element" {
285- if el. attributes . contains_key ( "ref" ) {
286- } else {
287- let mut elem = SDFElement :: new ( ) ;
288- parse_element ( & mut elem, el) ;
289- model. child_elems . push ( elem) ;
290- }
292+ let mut elem = SDFElement :: new ( ) ;
293+ parse_element ( & mut elem, el) ;
294+ model. child_elems . push ( elem) ;
291295 } else if el. name == "include" {
292296 let incl = SDFIncludes {
293297 filename : el. attributes . get ( "filename" ) . unwrap ( ) . to_string ( ) ,
0 commit comments