use std::path::PathBuf;
use crate::capsule::{Capsule, CompositeCapsule};
use crate::error::CapsuleResult;
use crate::manifest::CapsuleManifest;
use astrid_mcp::McpClient;
pub struct CapsuleLoader {
mcp_client: McpClient,
}
impl CapsuleLoader {
#[must_use]
pub fn new(mcp_client: McpClient) -> Self {
Self { mcp_client }
}
pub fn create_capsule(
&self,
manifest: CapsuleManifest,
capsule_dir: PathBuf,
) -> CapsuleResult<Box<dyn Capsule>> {
let mut composite = CompositeCapsule::new(manifest.clone())?;
if manifest.component.is_some() {
composite.add_engine(Box::new(crate::engine::WasmEngine::new(
manifest.clone(),
capsule_dir.clone(),
)));
}
for server in &manifest.mcp_servers {
if server.server_type.as_deref() == Some("stdio") {
composite.add_engine(Box::new(crate::engine::McpHostEngine::new(
manifest.clone(),
server.clone(),
capsule_dir.clone(),
self.mcp_client.clone(),
)));
}
}
composite.add_engine(Box::new(crate::engine::StaticEngine::new(
manifest.clone(),
capsule_dir,
)));
Ok(Box::new(composite))
}
}