@@ -167,10 +167,16 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> {
167167 }
168168
169169 if false == is_rust_native {
170- cg ! ( self , "let mut {} = Vec::with_capacity({} as usize);" , name, n) ;
171- cg ! ( self , "for _ in 0..{} as usize {{" , n) ;
170+ type_prefix = "" ;
171+ if n. parse :: < usize > ( ) . is_ok ( ) {
172+ cg ! ( self , "let mut {}: [{}{}; {}] = core::array::from_fn(|i| {}{}::default());" , name, type_prefix, rust_type, n, type_prefix, rust_type) ;
173+ } else {
174+ cg ! ( self , "let mut {}: [{}{}; ({} as usize)] = core::array::from_fn(|i| {}{}::default());" , name, type_prefix, rust_type, n, type_prefix, rust_type) ;
175+ }
176+
177+ cg ! ( self , "for index in 0..{} as usize {{" , n) ;
172178 self . indent ( ) ;
173- cg ! ( self , "{}.push( {}::decode(decoder)?) ;" , name, rust_type) ;
179+ cg ! ( self , "{}[index] = {}::decode(decoder)?;" , name, rust_type) ;
174180 self . dedent ( ) ;
175181 cg ! ( self , "}}" ) ;
176182 } else {
@@ -359,7 +365,7 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> {
359365 }
360366
361367 cg ! ( self ) ;
362- cg ! ( self , r#"#[derive(Debug)]"# ) ;
368+ cg ! ( self , r#"#[derive(Debug, Clone, Default )]"# ) ;
363369 cg ! ( self , "pub struct {} {{" , complex. name( ) ) ;
364370 self . indent ( ) ;
365371 match complex. content ( ) {
@@ -399,14 +405,14 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> {
399405 match complex. content ( ) {
400406 Seq ( ref s) => {
401407 for elem in s. elements ( ) {
402- let data = elem. name ( ) . to_string ( ) . to_snake_case ( ) ;
403- cg ! ( self , "self.{}.encode(encoder)?;" , data ) ;
408+ let name = rename_if_reserved ( elem. name ( ) ) ;
409+ cg ! ( self , "self.{}.encode(encoder)?;" , name ) ;
404410 }
405411 } ,
406412 Choice ( ref c) => {
407413 for elem in c. elements ( ) {
408- let data = elem. name ( ) . to_string ( ) . to_snake_case ( ) ;
409- cg ! ( self , "self.{}.encode(encoder)?;" , data ) ;
414+ let name = rename_if_reserved ( elem. name ( ) ) ;
415+ cg ! ( self , "self.{}.encode(encoder)?;" , name ) ;
410416 }
411417 } ,
412418 Empty => { }
@@ -431,7 +437,7 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> {
431437 match complex. content ( ) {
432438 Seq ( ref s) => {
433439 for elem in s. elements ( ) {
434- let name = elem. name ( ) . to_string ( ) . to_snake_case ( ) ;
440+ let name = rename_if_reserved ( elem. name ( ) ) ;
435441 let trimmed_type = elem. type_ ( ) . trim ( ) . to_string ( ) ;
436442 let mut is_rust_native = true ;
437443 let rust_type = iserialize. get ( elem. type_ ( ) . trim ( ) ) . map ( |s| s. to_string ( ) ) . unwrap_or_else ( || {
@@ -453,10 +459,16 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> {
453459 }
454460
455461 if false == is_rust_native {
456- cg ! ( self , "let mut {} = Vec::with_capacity({} as usize);" , name, n) ;
457- cg ! ( self , "for _ in 0..{} as usize {{" , n) ;
462+ type_prefix = "" ;
463+ if n. parse :: < usize > ( ) . is_ok ( ) {
464+ cg ! ( self , "let mut {}: [{}{}; {}] = core::array::from_fn(|i| {}{}::default());" , name, type_prefix, rust_type, n, type_prefix, rust_type) ;
465+ } else {
466+ cg ! ( self , "let mut {}: [{}{}; ({} as usize)] = core::array::from_fn(|i| {}{}::default());" , name, type_prefix, rust_type, n, type_prefix, rust_type) ;
467+ }
468+
469+ cg ! ( self , "for index in 0..{} as usize {{" , n) ;
458470 self . indent ( ) ;
459- cg ! ( self , "{}.push( {}::decode(decoder)?) ;" , name, rust_type) ;
471+ cg ! ( self , "{}[index] = {}::decode(decoder)?;" , name, rust_type) ;
460472 self . dedent ( ) ;
461473 cg ! ( self , "}}" ) ;
462474 } else {
@@ -481,7 +493,7 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> {
481493 } ,
482494 Choice ( ref c) => {
483495 for elem in c. elements ( ) {
484- let name = elem. name ( ) . to_string ( ) . to_snake_case ( ) ;
496+ let name = rename_if_reserved ( elem. name ( ) ) ;
485497 let trimmed_type = elem. type_ ( ) . trim ( ) . to_string ( ) ;
486498 let rust_type = iserialize. get ( elem. type_ ( ) . trim ( ) ) . map ( |s| s. to_string ( ) ) . unwrap_or_else ( || {
487499 debug ! ( r#"Type "{}" not found, outputting anyway"# , elem. type_( ) ) ;
@@ -539,7 +551,7 @@ impl<'a, W: Write> CodeSourceGenerator<'a, W> {
539551 Unbounded => format ! ( "Vec<{}>" , rust_type) ,
540552 Num ( n) => {
541553 if false == is_rust_native {
542- format ! ( "Vec<{}> " , rust_type)
554+ format ! ( "[{}; ({} as usize)] " , rust_type, n )
543555 } else {
544556 if n. parse :: < usize > ( ) . is_ok ( ) {
545557 format ! ( "[{}; {}]" , rust_type, n)
0 commit comments