actr_cli/commands/codegen/
mod.rs1mod 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}