mpstthree/top_down_nuscr/auxiliary_objects/code_generate/
structs.rs

1use super::super::{GlobalElements, Tree};
2use inflector::Inflector;
3use std::io::Write;
4
5/// Generate all structs in the global_elements.output file using all elements gathered from
6/// the nuscr protocol.
7pub(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            // Generate the structs for the global_elements.payloads
16            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}