Skip to main content

actr_cli/commands/codegen/
traits.rs

1use crate::commands::codegen::proto_model::ProtoModel;
2use crate::error::Result;
3use actr_config::ManifestConfig;
4use async_trait::async_trait;
5use std::path::PathBuf;
6
7/// Type of scaffold code to generate
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
9pub enum ScaffoldType {
10    /// Generate export-side scaffold only
11    Server,
12    /// Generate dependency-side scaffold only
13    Client,
14    /// Generate both export and dependency scaffolds
15    #[default]
16    Both,
17}
18
19/// Context for code generation
20#[derive(Debug, Clone)]
21pub struct GenContext {
22    pub proto_files: Vec<PathBuf>,
23    pub proto_model: ProtoModel,
24    pub input_path: PathBuf,
25    pub output: PathBuf,
26    pub config_path: PathBuf,
27    pub config: ManifestConfig,
28    pub no_scaffold: bool,
29    pub overwrite_user_code: bool,
30    pub no_format: bool,
31    pub debug: bool,
32    pub skip_validation: bool,
33}
34
35/// Interface for language-specific code generators
36#[async_trait]
37pub trait LanguageGenerator: Send + Sync {
38    /// Generate infrastructure code (e.g., protobuf types, actors)
39    async fn generate_infrastructure(&self, context: &GenContext) -> Result<Vec<PathBuf>>;
40
41    /// Generate user code scaffold
42    async fn generate_scaffold(&self, context: &GenContext) -> Result<Vec<PathBuf>>;
43
44    /// Format generated code using language-specific tools
45    async fn format_code(&self, context: &GenContext, files: &[PathBuf]) -> Result<()>;
46
47    /// Validate generated code (e.g., using a compiler)
48    async fn validate_code(&self, context: &GenContext) -> Result<()>;
49
50    /// Finalize generation (e.g., set files read-only). Default is no-op.
51    async fn finalize_generation(&self, _context: &GenContext) -> Result<()> {
52        Ok(())
53    }
54
55    /// Print next steps
56    fn print_next_steps(&self, context: &GenContext);
57}