mpstthree/top_down_nuscr/auxiliary_objects/code_generate/
structs.rs1use super::super::{GlobalElements, Tree};
2use inflector::Inflector;
3use std::io::Write;
4
5pub(crate) fn generate_structs(
8 global_elements: &mut GlobalElements,
9 main_tree: &Tree,
10 already_generated: &mut Vec<String>,
11 comment_payload: bool,
12) -> Result<(), Box<dyn std::error::Error>> {
13 match global_elements.output.as_mut() {
14 Some(generated_file) => {
15 if comment_payload {
17 writeln!(generated_file, "// Types of the payloads")?;
18 }
19
20 for payload in global_elements.payloads.iter() {
21 if !already_generated.contains(&(payload).to_title_case()) {
22 writeln!(
23 generated_file,
24 "struct {};",
25 payload
26 .to_title_case()
27 .chars()
28 .filter(|c| !c.is_whitespace())
29 .collect::<String>()
30 )?;
31 already_generated.push(payload.to_title_case().to_string());
32 }
33 }
34
35 for (name_message, payload) in main_tree.messages_with_payloads.iter() {
36 if !already_generated.contains(&(name_message).to_title_case()) {
37 if payload.is_empty() {
38 writeln!(
39 generated_file,
40 "struct {};",
41 name_message
42 .to_title_case()
43 .chars()
44 .filter(|c| !c.is_whitespace())
45 .collect::<String>()
46 )?;
47 } else {
48 writeln!(
49 generated_file,
50 "struct {} {{ payload: {} }}",
51 name_message
52 .to_title_case()
53 .chars()
54 .filter(|c| !c.is_whitespace())
55 .collect::<String>(),
56 payload
57 .to_title_case()
58 .chars()
59 .filter(|c| !c.is_whitespace())
60 .collect::<String>()
61 )?;
62 }
63 already_generated.push(name_message.to_title_case().to_string());
64 }
65 }
66
67 writeln!(generated_file)?;
68
69 for sub_tree in &main_tree.sub_trees {
70 generate_structs(global_elements, sub_tree, already_generated, false)?;
71 }
72
73 Ok(())
74 }
75 None => Err("Generated file was not initialised.".into()),
76 }
77}