use crate::clock::{SharedClock, SystemClock};
use crate::error::BuildError;
use crate::redactor::{DefaultRedactor, SharedRedactor};
use crate::runtime::supervised::SupervisedAgent;
use crate::tenant::TenantResolver;
use klieo_core::Agent;
use std::sync::Arc;
pub struct OpsRuntime;
impl OpsRuntime {
#[must_use]
pub fn builder() -> OpsRuntimeBuilder {
OpsRuntimeBuilder::default()
}
}
pub struct OpsRuntimeBuilder {
tenant_resolver: Option<Arc<dyn TenantResolver>>,
redactor: SharedRedactor,
clock: SharedClock,
}
impl Default for OpsRuntimeBuilder {
fn default() -> Self {
Self {
tenant_resolver: None,
redactor: Arc::new(DefaultRedactor::new()),
clock: Arc::new(SystemClock::default()),
}
}
}
impl OpsRuntimeBuilder {
#[must_use]
pub fn tenant_resolver(mut self, r: Arc<dyn TenantResolver>) -> Self {
self.tenant_resolver = Some(r);
self
}
#[must_use]
pub fn redactor(mut self, r: SharedRedactor) -> Self {
self.redactor = r;
self
}
#[must_use]
pub fn clock(mut self, c: SharedClock) -> Self {
self.clock = c;
self
}
pub fn spawn<A>(self, agent: A) -> Result<SupervisedAgent<A>, BuildError>
where
A: Agent,
{
let tenant_resolver =
self.tenant_resolver
.ok_or_else(|| BuildError::MissingDependency {
needed_by: "OpsRuntime".into(),
missing: "tenant_resolver".into(),
})?;
let _ = (&self.redactor, &self.clock);
Ok(SupervisedAgent {
inner: agent,
tenant_resolver,
})
}
}