use crate::runner::{EffectInterpreter, KitError, LocalEffectInterpreter, OrchestratedRunner};
use layer0::orchestrator::Orchestrator;
use layer0::state::StateStore;
use std::sync::Arc;
#[derive(Clone)]
pub struct Kit {
orch: Arc<dyn Orchestrator>,
state: Option<Arc<dyn StateStore>>,
}
impl Kit {
pub fn new(orch: Arc<dyn Orchestrator>) -> Self {
Self { orch, state: None }
}
pub fn with_state(mut self, state: Arc<dyn StateStore>) -> Self {
self.state = Some(state);
self
}
pub fn orchestrator(&self) -> &Arc<dyn Orchestrator> {
&self.orch
}
pub fn state(&self) -> Option<&Arc<dyn StateStore>> {
self.state.as_ref()
}
pub fn runner_with_interpreter<E: EffectInterpreter>(
&self,
executor: Arc<E>,
) -> OrchestratedRunner<E> {
OrchestratedRunner::new(Arc::clone(&self.orch), executor)
}
pub fn local_runner(
&self,
) -> Result<OrchestratedRunner<LocalEffectInterpreter<dyn StateStore>>, KitError> {
let state = self
.state
.as_ref()
.ok_or_else(|| KitError::Effect("local_runner requires a state backend".into()))?;
Ok(OrchestratedRunner::new(
Arc::clone(&self.orch),
Arc::new(LocalEffectInterpreter::new(Arc::clone(state))),
))
}
}