use crate::shutdown::stage::{ShutdownCause, ShutdownPhase, ShutdownPolicy};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ShutdownResult {
pub phase: ShutdownPhase,
pub cause: ShutdownCause,
pub idempotent: bool,
}
#[derive(Debug, Clone)]
pub struct ShutdownCoordinator {
pub policy: ShutdownPolicy,
phase: ShutdownPhase,
cause: Option<ShutdownCause>,
}
impl ShutdownCoordinator {
pub fn new(policy: ShutdownPolicy) -> Self {
Self {
policy,
phase: ShutdownPhase::Idle,
cause: None,
}
}
pub fn request_stop(&mut self, cause: ShutdownCause) -> ShutdownResult {
if let Some(existing) = self.cause.clone() {
return self.result(existing, true);
}
self.phase = ShutdownPhase::RequestStop;
self.cause = Some(cause.clone());
self.result(cause, false)
}
pub fn advance(&mut self) -> ShutdownPhase {
if let Some(next) = self.phase.next() {
self.phase = next;
}
self.phase
}
pub fn complete(&mut self) -> ShutdownPhase {
self.phase = ShutdownPhase::Completed;
self.phase
}
pub fn phase(&self) -> ShutdownPhase {
self.phase
}
fn result(&self, cause: ShutdownCause, idempotent: bool) -> ShutdownResult {
ShutdownResult {
phase: self.phase,
cause,
idempotent,
}
}
}