uika_codegen/rust_gen/
mod.rs1pub 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
15pub fn generate(ctx: &CodegenContext, out_dir: &Path) {
17 std::fs::create_dir_all(out_dir).expect("Failed to create Rust output directory");
19
20 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 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 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 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 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 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 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}