Skip to main content

rusteal_codegen/rust_gen/
mod.rs

1// Rust code generation orchestrator.
2
3pub mod enums;
4pub mod structs;
5pub mod classes;
6pub mod properties;
7pub mod delegates;
8pub mod module;
9pub mod func_ids;
10pub mod param_helpers;
11pub mod cargo_toml;
12pub mod manual;
13pub mod prelude;
14
15use std::path::Path;
16
17use crate::context::CodegenContext;
18
19/// Generate all Rust code into the output directory.
20pub fn generate(ctx: &CodegenContext, out_dir: &Path) {
21    // Ensure output directory exists
22    std::fs::create_dir_all(out_dir).expect("Failed to create Rust output directory");
23
24    // Generate per-module code
25    for module_name in ctx.enabled_modules.iter() {
26        let module_dir = out_dir.join(module_name);
27        // Start from an empty module directory so types dropped by this run (blocklist,
28        // engine upgrade) do not linger as stale files.
29        if module_dir.exists() {
30            std::fs::remove_dir_all(&module_dir).expect("Failed to clear module directory");
31        }
32        std::fs::create_dir_all(&module_dir).expect("Failed to create module directory");
33
34        // Enums
35        if let Some(module_enums) = ctx.module_enums.get(module_name) {
36            for e in module_enums {
37                let code = enums::generate_enum(e);
38                let filename = crate::naming::to_snake_case(&e.name) + ".rs";
39                std::fs::write(module_dir.join(&filename), code)
40                    .unwrap_or_else(|err| panic!("Failed to write {filename}: {err}"));
41            }
42        }
43
44        // Structs
45        if let Some(module_structs) = ctx.module_structs.get(module_name) {
46            for s in module_structs {
47                let code = structs::generate_struct(s, ctx);
48                let filename = crate::naming::to_snake_case(&s.name) + ".rs";
49                std::fs::write(module_dir.join(&filename), code)
50                    .unwrap_or_else(|err| panic!("Failed to write {filename}: {err}"));
51            }
52        }
53
54        // Classes
55        if let Some(module_classes) = ctx.module_classes.get(module_name) {
56            for c in module_classes {
57                let code = classes::generate_class(c, ctx);
58                let filename = crate::naming::to_snake_case(&c.name) + ".rs";
59                std::fs::write(module_dir.join(&filename), code)
60                    .unwrap_or_else(|err| panic!("Failed to write {filename}: {err}"));
61            }
62        }
63
64        // Module mod.rs
65        let mod_code = module::generate_module_mod(
66            module_name,
67            ctx.module_enums.get(module_name).map(|v| v.as_slice()),
68            ctx.module_structs.get(module_name).map(|v| v.as_slice()),
69            ctx.module_classes.get(module_name).map(|v| v.as_slice()),
70        );
71        std::fs::write(module_dir.join("mod.rs"), mod_code)
72            .expect("Failed to write module mod.rs");
73    }
74
75    // Generate func_ids.rs
76    let func_ids_code = func_ids::generate_rust_func_ids(&ctx.func_table);
77    std::fs::write(out_dir.join("func_ids.rs"), func_ids_code)
78        .expect("Failed to write func_ids.rs");
79
80    // Generate top-level lib.rs
81    let lib_code = module::generate_lib_rs(ctx);
82    std::fs::write(out_dir.join("lib.rs"), lib_code).expect("Failed to write lib.rs");
83}