use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use tokio::sync::watch;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ReadinessState {
Unreported,
Ready,
NotReady,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ReadinessPolicy {
Immediate,
Explicit,
}
impl ReadinessPolicy {
pub fn is_immediate(self) -> bool {
matches!(self, Self::Immediate)
}
}
#[derive(Debug, Clone)]
pub struct ReadySignal {
sender: watch::Sender<ReadinessState>,
}
impl ReadySignal {
pub fn new() -> (Self, watch::Receiver<ReadinessState>) {
let (sender, receiver) = watch::channel(ReadinessState::Unreported);
(Self { sender }, receiver)
}
pub fn mark_ready(&self) {
self.set_readiness(ReadinessState::Ready);
}
pub fn set_readiness(&self, state: ReadinessState) {
let _ignored = self.sender.send(state);
}
pub fn subscribe(&self) -> watch::Receiver<ReadinessState> {
self.sender.subscribe()
}
}