39 lines
1.7 KiB
Rust
39 lines
1.7 KiB
Rust
|
|
use crate::box_trait::{NyashBox, BoxCore, BoxBase, StringBox, BoolBox};
|
||
|
|
use std::any::Any;
|
||
|
|
|
||
|
|
/// Cancellation token as a Box for structured concurrency
|
||
|
|
#[derive(Debug, Clone)]
|
||
|
|
pub struct TokenBox {
|
||
|
|
base: BoxBase,
|
||
|
|
token: crate::runtime::scheduler::CancellationToken,
|
||
|
|
}
|
||
|
|
|
||
|
|
impl TokenBox {
|
||
|
|
pub fn new() -> Self { Self { base: BoxBase::new(), token: crate::runtime::scheduler::CancellationToken::new() } }
|
||
|
|
pub fn from_token(token: crate::runtime::scheduler::CancellationToken) -> Self { Self { base: BoxBase::new(), token } }
|
||
|
|
pub fn cancel(&self) { self.token.cancel(); }
|
||
|
|
pub fn is_cancelled(&self) -> bool { self.token.is_cancelled() }
|
||
|
|
pub fn inner(&self) -> crate::runtime::scheduler::CancellationToken { self.token.clone() }
|
||
|
|
}
|
||
|
|
|
||
|
|
impl BoxCore for TokenBox {
|
||
|
|
fn box_id(&self) -> u64 { self.base.id }
|
||
|
|
fn parent_type_id(&self) -> Option<std::any::TypeId> { None }
|
||
|
|
fn fmt_box(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||
|
|
write!(f, "CancellationToken(cancelled={})", self.token.is_cancelled())
|
||
|
|
}
|
||
|
|
fn as_any(&self) -> &dyn Any { self }
|
||
|
|
fn as_any_mut(&mut self) -> &mut dyn Any { self }
|
||
|
|
}
|
||
|
|
|
||
|
|
impl NyashBox for TokenBox {
|
||
|
|
fn to_string_box(&self) -> StringBox { StringBox::new(format!("CancellationToken(cancelled={})", self.token.is_cancelled())) }
|
||
|
|
fn equals(&self, other: &dyn NyashBox) -> BoolBox {
|
||
|
|
if let Some(o) = other.as_any().downcast_ref::<TokenBox>() {
|
||
|
|
BoolBox::new(self.is_cancelled() == o.is_cancelled())
|
||
|
|
} else { BoolBox::new(false) }
|
||
|
|
}
|
||
|
|
fn clone_box(&self) -> Box<dyn NyashBox> { Box::new(self.clone()) }
|
||
|
|
fn share_box(&self) -> Box<dyn NyashBox> { Box::new(self.clone()) }
|
||
|
|
}
|