use async_trait::async_trait;
use std::path::PathBuf;
use std::sync::Arc;
use crate::infrastructure::{Template, TemplateDiscovery, TemplateError, TemplateLoader};
pub struct TemplateLoaderDiscoveryAdapter {
loader: Arc<dyn TemplateLoader>,
template_path: PathBuf,
}
impl TemplateLoaderDiscoveryAdapter {
pub fn new(loader: Arc<dyn TemplateLoader>, template_path: PathBuf) -> Self {
Self {
loader,
template_path,
}
}
}
#[async_trait]
impl TemplateDiscovery for TemplateLoaderDiscoveryAdapter {
async fn discover(
&self,
_protocol: crate::protocols::Protocol,
_role: crate::protocols::Role,
_language: crate::generation::Language,
) -> Result<Template, TemplateError> {
self.loader.load_template(&self.template_path).await
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::generation::Language;
use crate::protocols::{Protocol, Role};
struct MockTemplateLoader {
template: Template,
}
#[async_trait]
impl TemplateLoader for MockTemplateLoader {
async fn load_template(&self, _path: &std::path::Path) -> Result<Template, TemplateError> {
Ok(self.template.clone())
}
}
#[tokio::test]
async fn test_adapter_ignores_requested_attributes() {
use crate::infrastructure::TemplateManifest;
use std::collections::HashMap;
let manifest = TemplateManifest {
name: "test-template".to_string(),
version: "1.0.0".to_string(),
description: None,
path: "mcp/client/go".to_string(),
protocol: Protocol::Mcp,
role: Role::Client,
language: Language::Go,
files: vec![],
variables: HashMap::new(),
post_generate_hooks: vec![],
};
let template = Template {
manifest: manifest.clone(),
files: vec![],
source: crate::infrastructure::TemplateSource::Embedded,
};
let loader = Arc::new(MockTemplateLoader {
template: template.clone(),
});
let adapter = TemplateLoaderDiscoveryAdapter::new(loader, PathBuf::from("/some/path"));
let result = adapter
.discover(Protocol::A2a, Role::Server, Language::Rust)
.await
.unwrap();
assert_eq!(result.manifest.protocol, Protocol::Mcp);
assert_eq!(result.manifest.role, Role::Client);
assert_eq!(result.manifest.language, Language::Go);
}
}