pub mod docker;
use std::sync::Arc;
use crate::ports::{Substrate, SubstrateFactory, SubstrateResolver};
#[derive(Default)]
pub struct SubstrateRegistry {
factories: Vec<Box<dyn SubstrateFactory>>,
}
impl SubstrateRegistry {
pub fn new() -> Self {
Self {
factories: Vec::new(),
}
}
pub fn register(mut self, factory: Box<dyn SubstrateFactory>) -> Self {
self.factories.push(factory);
self
}
pub fn registered_names(&self) -> Vec<&'static str> {
self.factories.iter().map(|f| f.name()).collect()
}
}
impl SubstrateResolver for SubstrateRegistry {
fn resolve(&self, name: &str) -> Result<Arc<dyn Substrate>, String> {
self.factories
.iter()
.find(|f| f.name() == name)
.ok_or_else(|| {
format!(
"unknown substrate '{}' (registered: {})",
name,
self.registered_names().join(", ")
)
})
.and_then(|f| f.build())
}
}