Skip to main content

rusteal_codegen/rust_gen/
module.rs

1use crate::context::CodegenContext;
2use crate::naming::{is_reserved, to_snake_case};
3use crate::schema::{ClassInfo, EnumInfo, StructInfo};
4
5pub fn generate_module_mod(
6    _module_name: &str,
7    enums: Option<&[EnumInfo]>,
8    structs: Option<&[StructInfo]>,
9    classes: Option<&[ClassInfo]>,
10) -> String {
11    let mut out = String::with_capacity(4096);
12    out.push_str("// Auto-generated by rusteal-codegen. Do not edit.\n\n");
13
14    if let Some(enums) = enums {
15        for e in enums {
16            let mod_name = to_snake_case(&e.name);
17            write_mod_use(&mut out, &mod_name);
18        }
19    }
20
21    if let Some(structs) = structs {
22        for s in structs {
23            let mod_name = to_snake_case(&s.name);
24            write_mod_use(&mut out, &mod_name);
25        }
26    }
27
28    if let Some(classes) = classes {
29        for c in classes {
30            let mod_name = to_snake_case(&c.name);
31            write_mod_use(&mut out, &mod_name);
32        }
33    }
34
35    out
36}
37
38fn write_mod_use(out: &mut String, mod_name: &str) {
39    if is_reserved(mod_name) {
40        out.push_str(&format!("#[path = \"{mod_name}.rs\"]\n"));
41        out.push_str(&format!("mod r#{mod_name};\n"));
42        out.push_str(&format!("pub use r#{mod_name}::*;\n\n"));
43    } else {
44        out.push_str(&format!("mod {mod_name};\n"));
45        out.push_str(&format!("pub use {mod_name}::*;\n\n"));
46    }
47}
48
49pub fn generate_lib_rs(ctx: &CodegenContext) -> String {
50    let mut out = String::with_capacity(1024);
51    out.push_str("// Auto-generated by rusteal-codegen. Do not edit.\n\n");
52    out.push_str("#![allow(non_camel_case_types, non_snake_case, dead_code, unused_imports)]\n");
53    out.push_str("#![allow(clippy::all)]\n\n");
54    out.push_str("pub mod func_ids;\n\n");
55
56    let mut modules: Vec<&String> = ctx.enabled_modules.iter().collect();
57    modules.sort();
58
59    for module in modules {
60        if let Some(feature) = ctx.feature_for_module(module) {
61            out.push_str(&format!(
62                "#[cfg(feature = \"{feature}\")]\npub mod {module};\n\n"
63            ));
64        } else {
65            out.push_str(&format!("pub mod {module};\n\n"));
66        }
67    }
68
69    out.push_str("pub mod manual;\n\n");
70    out.push_str("pub mod prelude;\n\n");
71
72    out
73}