Skip to main content

actr_cli/commands/codegen/
mod.rs

1mod kotlin;
2mod metadata;
3mod proto_model;
4mod python;
5mod rust;
6mod scaffold;
7mod swift;
8mod traits;
9mod typescript;
10
11pub use crate::commands::SupportedLanguage;
12use crate::error::Result;
13use kotlin::KotlinGenerator;
14pub use metadata::{
15    ACTR_GEN_META_FILE, ActrGenMetadata, load_metadata, metadata_path, write_metadata,
16};
17pub use proto_model::{MethodModel, ProtoFileModel, ProtoModel, ProtoSide, ServiceModel};
18use python::PythonGenerator;
19use rust::RustGenerator;
20pub use scaffold::{ScaffoldCatalog, ScaffoldMethod, ScaffoldService};
21use swift::SwiftGenerator;
22use tracing::info;
23pub use traits::{GenContext, LanguageGenerator, ScaffoldType};
24use typescript::TypeScriptGenerator;
25
26pub struct GeneratorFactory;
27
28impl GeneratorFactory {
29    pub fn get_generator(language: SupportedLanguage) -> Box<dyn LanguageGenerator> {
30        match language {
31            SupportedLanguage::Rust => Box::new(RustGenerator),
32            SupportedLanguage::Python => Box::new(PythonGenerator),
33            SupportedLanguage::Swift => Box::new(SwiftGenerator),
34            SupportedLanguage::Kotlin => Box::new(KotlinGenerator),
35            SupportedLanguage::TypeScript => Box::new(TypeScriptGenerator),
36        }
37    }
38}
39
40pub async fn execute_codegen(language: SupportedLanguage, context: &GenContext) -> Result<()> {
41    let generator = GeneratorFactory::get_generator(language);
42
43    let mut all_files = generator.generate_infrastructure(context).await?;
44    let metadata = ActrGenMetadata::from_proto_model(language, &context.proto_model);
45    write_metadata(&context.output, &metadata)?;
46    if !context.no_scaffold {
47        all_files.extend(generator.generate_scaffold(context).await?);
48    }
49    if !context.no_format {
50        generator.format_code(context, &all_files).await?;
51    }
52
53    generator.validate_code(context).await?;
54
55    info!("Code generation completed");
56
57    generator.finalize_generation(context).await?;
58
59    generator.print_next_steps(context);
60    Ok(())
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66
67    #[test]
68    fn generator_factory_returns_all_languages() {
69        for language in [
70            SupportedLanguage::Rust,
71            SupportedLanguage::Python,
72            SupportedLanguage::Swift,
73            SupportedLanguage::Kotlin,
74            SupportedLanguage::TypeScript,
75        ] {
76            let _ = GeneratorFactory::get_generator(language);
77        }
78    }
79}