rusteal-codegen 0.8.0

Code generator: UHT JSON to Rust bindings and C++ wrappers for rusteal
Documentation
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
}