use crate::commands::codegen::proto_model::ProtoModel;
use crate::error::Result;
use actr_config::ManifestConfig;
use async_trait::async_trait;
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ScaffoldType {
Server,
Client,
#[default]
Both,
}
#[derive(Debug, Clone)]
pub struct GenContext {
pub proto_files: Vec<PathBuf>,
pub proto_model: ProtoModel,
pub input_path: PathBuf,
pub output: PathBuf,
pub config_path: PathBuf,
pub config: ManifestConfig,
pub no_scaffold: bool,
pub overwrite_user_code: bool,
pub no_format: bool,
pub debug: bool,
pub skip_validation: bool,
}
#[async_trait]
pub trait LanguageGenerator: Send + Sync {
async fn generate_infrastructure(&self, context: &GenContext) -> Result<Vec<PathBuf>>;
async fn generate_scaffold(&self, context: &GenContext) -> Result<Vec<PathBuf>>;
async fn format_code(&self, context: &GenContext, files: &[PathBuf]) -> Result<()>;
async fn validate_code(&self, context: &GenContext) -> Result<()>;
async fn finalize_generation(&self, _context: &GenContext) -> Result<()> {
Ok(())
}
fn print_next_steps(&self, context: &GenContext);
}