use std::sync::Arc;
use ek_core::error::PluginError;
use ek_core::main_engine::MainEngine;
use crate::factory::PlugKind;
use crate::supervisor::Supervisor;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct StationConfig {
pub plugins: Vec<String>,
}
impl StationConfig {
#[must_use]
pub fn demo() -> Self {
Self {
plugins: vec!["dm".to_string(), "oms".to_string()],
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StationError {
UnknownKind(String),
Core(PluginError),
}
impl std::fmt::Display for StationError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
StationError::UnknownKind(k) => write!(f, "unknown factory kind: {k}"),
StationError::Core(e) => write!(f, "host rejected: {e:?}"),
}
}
}
impl std::error::Error for StationError {}
impl From<PluginError> for StationError {
fn from(e: PluginError) -> Self {
StationError::Core(e)
}
}
pub fn boot(
engine: &Arc<MainEngine>,
kinds: &[PlugKind],
cfg: &StationConfig,
) -> Result<(), StationError> {
let sup = Arc::new(Supervisor::new(Arc::clone(engine), kinds.to_vec()));
engine.add_plugin(sup)?;
for name in &cfg.plugins {
let kind = kinds
.iter()
.find(|k| k.name == *name)
.ok_or_else(|| StationError::UnknownKind(name.clone()))?;
engine.add_plugin(crate::factory::DynPlugin::wrap((kind.build)()))?;
}
Ok(())
}