use crate::api::{DebugAttestor, DebugLockManager, DebugOwnershipOracle, DebugSmokeTestRunner};
use crate::constants::DEFAULT_LOCK_TIMEOUT_MS;
use crate::logging::{AuditSink, FactsEmitter};
use crate::policy::Policy;
#[derive(Debug)]
pub struct ApiBuilder<E: FactsEmitter, A: AuditSink> {
facts: E,
audit: A,
policy: Policy,
lock: Option<Box<dyn DebugLockManager>>, owner: Option<Box<dyn DebugOwnershipOracle>>, attest: Option<Box<dyn DebugAttestor>>, smoke: Option<Box<dyn DebugSmokeTestRunner>>, lock_timeout_ms: Option<u64>,
}
impl<E: FactsEmitter, A: AuditSink> ApiBuilder<E, A> {
pub fn new(facts: E, audit: A, policy: Policy) -> Self {
Self {
facts,
audit,
policy,
lock: None,
owner: None,
attest: None,
smoke: None,
lock_timeout_ms: None,
}
}
pub fn build(self) -> super::Switchyard<E, A> {
let mut api = super::Switchyard {
facts: self.facts,
audit: self.audit,
policy: self.policy,
overrides: super::overrides::Overrides::default(),
lock: None,
owner: None,
attest: None,
smoke: None,
lock_timeout_ms: self.lock_timeout_ms.unwrap_or(DEFAULT_LOCK_TIMEOUT_MS),
};
if let Some(lock) = self.lock {
api.lock = Some(lock);
}
if let Some(owner) = self.owner {
api.owner = Some(owner);
}
if let Some(att) = self.attest {
api.attest = Some(att);
}
if let Some(smoke) = self.smoke {
api.smoke = Some(smoke);
}
api
}
#[must_use]
pub fn with_lock_manager(mut self, lock: Box<dyn DebugLockManager>) -> Self {
self.lock = Some(lock);
self
}
#[must_use]
pub fn with_ownership_oracle(mut self, owner: Box<dyn DebugOwnershipOracle>) -> Self {
self.owner = Some(owner);
self
}
#[must_use]
pub fn with_attestor(mut self, attest: Box<dyn DebugAttestor>) -> Self {
self.attest = Some(attest);
self
}
#[must_use]
pub fn with_smoke_runner(mut self, smoke: Box<dyn DebugSmokeTestRunner>) -> Self {
self.smoke = Some(smoke);
self
}
#[must_use]
pub const fn with_lock_timeout_ms(mut self, timeout_ms: u64) -> Self {
self.lock_timeout_ms = Some(timeout_ms);
self
}
}