use super::event::RestoreOrigin;
use crate::sandbox::record::PersistPhase;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum Notify {
Created,
Ready,
Running,
Idle,
Stopping,
Stopped,
Failed,
Removed,
Pausing,
Paused,
Resumed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum Durability {
Warn,
GateJournal,
Report(Unconfirmed),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum Unconfirmed {
Ack,
Unavailable,
RevertToPaused,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReleaseScope {
Runtime,
KeepDisk,
Full,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum RecordEnd {
Aborted,
Removed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum Timer {
Ttl,
Idle,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum Answer {
Ready,
Resumed,
Paused,
Stopped,
Removed,
Detached,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(super) enum Effect {
PersistPhase {
phase: PersistPhase,
durability: Durability,
},
CommitRestored {
durability: Durability,
},
ForgetRecord(RecordEnd),
SpawnBoot {
warm: bool,
},
SpawnRestore {
origin: RestoreOrigin,
},
SpawnGate,
SpawnCheckpoint {
hold: bool,
},
SpawnResume,
SpawnStop {
budget_ms: u64,
drain: bool,
},
SpawnRelease {
scope: ReleaseScope,
},
Detach,
AbortInflight,
Publish(Notify),
ArmTimer(Timer),
CancelTimer(Timer),
Answer(Answer),
ClearJournal,
}
#[derive(Debug, Default)]
pub(super) struct Effects {
items: Vec<Effect>,
}
impl Effects {
pub(super) fn emit(&mut self, effect: Effect) {
self.items.push(effect);
}
pub(super) fn persist(&mut self, phase: PersistPhase, durability: Durability) {
self.emit(Effect::PersistPhase { phase, durability });
}
pub(super) fn release(&mut self, scope: ReleaseScope) {
self.emit(Effect::SpawnRelease { scope });
}
pub(super) fn stop(&mut self, budget_ms: u64, drain: bool) {
self.persist(PersistPhase::Stopping, Durability::Warn);
self.emit(Effect::CancelTimer(Timer::Idle));
self.emit(Effect::Publish(Notify::Stopping));
self.emit(Effect::SpawnStop { budget_ms, drain });
}
pub(super) fn removal(&mut self) {
self.emit(Effect::AbortInflight);
self.emit(Effect::CancelTimer(Timer::Ttl));
self.emit(Effect::CancelTimer(Timer::Idle));
self.persist(PersistPhase::Removing, Durability::Warn);
self.release(ReleaseScope::Full);
}
pub(super) fn failure(&mut self) {
self.persist(PersistPhase::Failed, Durability::GateJournal);
self.release(ReleaseScope::Runtime);
self.emit(Effect::ClearJournal);
self.emit(Effect::CancelTimer(Timer::Idle));
self.emit(Effect::CancelTimer(Timer::Ttl));
self.emit(Effect::Publish(Notify::Failed));
}
pub(super) fn take(&mut self) -> Vec<Effect> {
std::mem::take(&mut self.items)
}
}