use tokio_util::sync::{CancellationToken, DropGuard};
#[derive(Clone, Debug)]
pub struct SettlingToken(CancellationToken);
impl SettlingToken {
pub async fn settled(&self) {
self.0.cancelled().await
}
pub fn is_settled(&self) -> bool {
self.0.is_cancelled()
}
pub(crate) fn new() -> Self {
Self(CancellationToken::new())
}
pub(crate) fn signal_settlement(&self) {
self.0.cancel()
}
pub(crate) fn into_shutdown_token(self) -> ShutdownToken {
ShutdownToken(self.0)
}
}
#[derive(Clone, Debug)]
pub struct ShutdownToken(pub(crate) CancellationToken);
impl ShutdownToken {
pub fn signal_shutdown(&self) {
self.0.cancel()
}
pub fn guard(self) -> ShutdownGuard {
ShutdownGuard(self.0.drop_guard())
}
pub(crate) fn new() -> Self {
Self(CancellationToken::new())
}
}
pub struct ShutdownGuard(DropGuard);
impl ShutdownGuard {
pub fn disarm(self) -> ShutdownToken {
ShutdownToken(self.0.disarm())
}
}
#[derive(Clone, Debug)]
pub struct TerminationToken(CancellationToken);
impl TerminationToken {
pub async fn terminated(&self) {
self.0.cancelled().await
}
pub fn is_terminated(&self) -> bool {
self.0.is_cancelled()
}
pub(crate) fn new() -> Self {
Self(CancellationToken::new())
}
pub(crate) fn signal_termination(&self) {
self.0.cancel()
}
}