use std::fmt::Display;
use crate::times::{now, Timestamp};
#[derive(candid::CandidType, candid::Deserialize, Debug, Clone)]
pub struct MaintainingReason {
pub created: Timestamp,
pub message: String,
}
impl MaintainingReason {
pub fn new(message: String) -> Self {
MaintainingReason {
created: now(),
message,
}
}
}
pub trait Maintainable {
fn maintaining_must_be_running(&self);
fn maintaining_must_be_maintaining(&self);
fn maintaining_is_maintaining(&self) -> bool;
fn maintaining_is_running(&self) -> bool {
!self.maintaining_is_maintaining()
}
fn maintaining_query(&self) -> Option<MaintainingReason>;
fn maintaining_update_maintaining(&mut self, reason: MaintainingReason);
fn maintaining_update_running(&mut self);
fn maintaining_replace(&mut self, reason: Option<MaintainingReason>) {
if let Some(reason) = reason {
self.maintaining_update_maintaining(reason)
} else {
self.maintaining_update_running()
}
}
}
#[derive(candid::CandidType, candid::Deserialize, Debug, Clone, Default)]
pub struct Maintaining(Option<MaintainingReason>);
impl Maintainable for Maintaining {
fn maintaining_must_be_running(&self) {
if let Some(reason) = &self.0 {
panic!("System is maintaining: {}", reason.message);
}
}
fn maintaining_must_be_maintaining(&self) {
if let None = &self.0 {
panic!("System is running. Not maintaining.");
}
}
fn maintaining_is_maintaining(&self) -> bool {
self.0.is_some()
}
fn maintaining_query(&self) -> Option<MaintainingReason> {
self.0.clone()
}
fn maintaining_update_maintaining(&mut self, reason: MaintainingReason) {
self.0 = Some(reason);
}
fn maintaining_update_running(&mut self) {
self.0 = None
}
}
impl Display for MaintainingReason {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&format!("{:?}", self))
}
}