use crate::generation::{
ContextBuilder, GenerationContext, GenerationError, GenerationResult, PostProcessor,
TemplateDiscovery, TemplateRenderingStrategy,
};
use std::sync::Arc;
pub struct GenerationOrchestrator {
template_discovery: Arc<dyn TemplateDiscovery>,
context_builder: Arc<dyn ContextBuilder>,
template_renderer: Arc<dyn TemplateRenderingStrategy>,
post_processor: Arc<dyn PostProcessor>,
}
impl GenerationOrchestrator {
pub fn new(
template_discovery: Arc<dyn TemplateDiscovery>,
context_builder: Arc<dyn ContextBuilder>,
template_renderer: Arc<dyn TemplateRenderingStrategy>,
post_processor: Arc<dyn PostProcessor>,
) -> Self {
Self {
template_discovery,
context_builder,
template_renderer,
post_processor,
}
}
pub async fn generate(
&self,
context: GenerationContext,
) -> Result<GenerationResult, GenerationError> {
context.validate()?;
tracing::debug!(
"Orchestrator starting generation for {:?}/{:?}",
context.protocol,
context.role
);
let template = self
.template_discovery
.discover(context.protocol, context.role.clone(), context.language)
.await?;
tracing::debug!(
protocol = %context.protocol,
role = %context.role,
language = %context.language,
source = %template.source,
"Using template for generation"
);
let render_context = self.context_builder.build(&context, &template).await?;
let artifacts = self
.template_renderer
.render(&template, &render_context, &context)
.await?;
let processed_artifacts = self
.post_processor
.process(artifacts, &context, &[]) .await?;
Ok(GenerationResult {
artifacts: processed_artifacts,
metadata: context.metadata,
post_generation_commands: template.manifest.post_generate_hooks,
})
}
}