Skip to main content

uika_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;
10
11use std::path::Path;
12
13use crate::context::CodegenContext;
14
15/// Generate all Rust code into the output directory.
16pub fn generate(ctx: &CodegenContext, out_dir: &Path) {
17    // Ensure output directory exists
18    std::fs::create_dir_all(out_dir).expect("Failed to create Rust output directory");
19
20    // Generate per-module code
21    for module_name in ctx.enabled_modules.iter() {
22        let module_dir = out_dir.join(module_name);
23        std::fs::create_dir_all(&module_dir).expect("Failed to create module directory");
24
25        // Enums
26        if let Some(module_enums) = ctx.module_enums.get(module_name) {
27            for e in module_enums {
28                let code = enums::generate_enum(e);
29                let filename = crate::naming::to_snake_case(&e.name) + ".rs";
30                std::fs::write(module_dir.join(&filename), code)
31                    .unwrap_or_else(|err| panic!("Failed to write {filename}: {err}"));
32            }
33        }
34
35        // Structs
36        if let Some(module_structs) = ctx.module_structs.get(module_name) {
37            for s in module_structs {
38                let code = structs::generate_struct(s, ctx);
39                let filename = crate::naming::to_snake_case(&s.name) + ".rs";
40                std::fs::write(module_dir.join(&filename), code)
41                    .unwrap_or_else(|err| panic!("Failed to write {filename}: {err}"));
42            }
43        }
44
45        // Classes
46        if let Some(module_classes) = ctx.module_classes.get(module_name) {
47            for c in module_classes {
48                let code = classes::generate_class(c, ctx);
49                let filename = crate::naming::to_snake_case(&c.name) + ".rs";
50                std::fs::write(module_dir.join(&filename), code)
51                    .unwrap_or_else(|err| panic!("Failed to write {filename}: {err}"));
52            }
53        }
54
55        // Module mod.rs
56        let mod_code = module::generate_module_mod(
57            module_name,
58            ctx.module_enums.get(module_name).map(|v| v.as_slice()),
59            ctx.module_structs.get(module_name).map(|v| v.as_slice()),
60            ctx.module_classes.get(module_name).map(|v| v.as_slice()),
61        );
62        std::fs::write(module_dir.join("mod.rs"), mod_code)
63            .expect("Failed to write module mod.rs");
64    }
65
66    // Generate func_ids.rs
67    let func_ids_code = func_ids::generate_rust_func_ids(&ctx.func_table);
68    std::fs::write(out_dir.join("func_ids.rs"), func_ids_code)
69        .expect("Failed to write func_ids.rs");
70
71    // Generate top-level lib.rs
72    let lib_code = module::generate_lib_rs(ctx);
73    std::fs::write(out_dir.join("lib.rs"), lib_code).expect("Failed to write lib.rs");
74}