use std::sync::Arc;
use meerkat_core::handles::{CommsDrainHandle, DrainExitReason, DrainMode, DslTransitionError};
use super::HandleDslAuthority;
use crate::meerkat_machine::dsl as mm_dsl;
#[derive(Debug)]
pub struct RuntimeCommsDrainHandle {
dsl: Arc<HandleDslAuthority>,
}
impl RuntimeCommsDrainHandle {
pub fn new(dsl: Arc<HandleDslAuthority>) -> Self {
Self { dsl }
}
pub fn ephemeral() -> Self {
Self::new(Arc::new(HandleDslAuthority::ephemeral()))
}
}
impl CommsDrainHandle for RuntimeCommsDrainHandle {
fn ensure_drain_running(&self) -> Result<(), DslTransitionError> {
self.dsl.apply_signal(
mm_dsl::MeerkatMachineSignal::EnsureDrainRunning,
"CommsDrainHandle::ensure_drain_running",
)
}
fn spawn_drain(&self, mode: DrainMode) -> Result<(), DslTransitionError> {
let mode = match mode {
DrainMode::Timed => mm_dsl::DrainMode::Timed,
DrainMode::AttachedSession => mm_dsl::DrainMode::AttachedSession,
DrainMode::PersistentHost => mm_dsl::DrainMode::PersistentHost,
};
self.dsl.apply_input(
mm_dsl::MeerkatMachineInput::SpawnDrain { mode },
"CommsDrainHandle::spawn_drain",
)
}
fn stop_drain(&self) -> Result<(), DslTransitionError> {
self.dsl.apply_input(
mm_dsl::MeerkatMachineInput::StopDrain,
"CommsDrainHandle::stop_drain",
)
}
fn drain_exited_clean(&self) -> Result<(), DslTransitionError> {
self.dsl.apply_input(
mm_dsl::MeerkatMachineInput::DrainExitedClean,
"CommsDrainHandle::drain_exited_clean",
)
}
fn drain_exited_respawnable(&self) -> Result<(), DslTransitionError> {
self.dsl.apply_input(
mm_dsl::MeerkatMachineInput::DrainExitedRespawnable,
"CommsDrainHandle::drain_exited_respawnable",
)
}
fn notify_drain_exited(&self, reason: DrainExitReason) -> Result<(), DslTransitionError> {
self.dsl.apply_input(
mm_dsl::MeerkatMachineInput::NotifyDrainExited {
reason: mm_dsl::DrainExitReason::from(reason),
},
"CommsDrainHandle::notify_drain_exited",
)
}
}