Skip to content

Commit 789b42b

Browse files
committed
- fix: no longer use Vec for a fixed array
- fix: issue where complex types could potentially output a rust reserved name
1 parent efaf8c3 commit 789b42b

File tree

1 file changed

+26
-14
lines changed

1 file changed

+26
-14
lines changed

generator/src/codegen/rust/codegen_source.rs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)