use crate::context::CodegenContext;
use crate::naming::{is_reserved, to_snake_case};
use crate::schema::{ClassInfo, EnumInfo, StructInfo};
pub fn generate_module_mod(
_module_name: &str,
enums: Option<&[EnumInfo]>,
structs: Option<&[StructInfo]>,
classes: Option<&[ClassInfo]>,
) -> String {
let mut out = String::with_capacity(4096);
out.push_str("// Auto-generated by rusteal-codegen. Do not edit.\n\n");
if let Some(enums) = enums {
for e in enums {
let mod_name = to_snake_case(&e.name);
write_mod_use(&mut out, &mod_name);
}
}
if let Some(structs) = structs {
for s in structs {
let mod_name = to_snake_case(&s.name);
write_mod_use(&mut out, &mod_name);
}
}
if let Some(classes) = classes {
for c in classes {
let mod_name = to_snake_case(&c.name);
write_mod_use(&mut out, &mod_name);
}
}
out
}
fn write_mod_use(out: &mut String, mod_name: &str) {
if is_reserved(mod_name) {
out.push_str(&format!("#[path = \"{mod_name}.rs\"]\n"));
out.push_str(&format!("mod r#{mod_name};\n"));
out.push_str(&format!("pub use r#{mod_name}::*;\n\n"));
} else {
out.push_str(&format!("mod {mod_name};\n"));
out.push_str(&format!("pub use {mod_name}::*;\n\n"));
}
}
pub fn generate_lib_rs(ctx: &CodegenContext) -> String {
let mut out = String::with_capacity(1024);
out.push_str("// Auto-generated by rusteal-codegen. Do not edit.\n\n");
out.push_str("#![allow(non_camel_case_types, non_snake_case, dead_code, unused_imports)]\n");
out.push_str("#![allow(clippy::all)]\n\n");
out.push_str("pub mod func_ids;\n\n");
let mut modules: Vec<&String> = ctx.enabled_modules.iter().collect();
modules.sort();
for module in modules {
if let Some(feature) = ctx.feature_for_module(module) {
out.push_str(&format!(
"#[cfg(feature = \"{feature}\")]\npub mod {module};\n\n"
));
} else {
out.push_str(&format!("pub mod {module};\n\n"));
}
}
out.push_str("pub mod manual;\n\n");
out.push_str("pub mod prelude;\n\n");
out
}