use kithara_events::TrackId;
use kithara_platform::CancelToken;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum LoadClass {
Interactive,
Prefetch,
}
pub(crate) struct Ticket {
pub(crate) id: TrackId,
pub(crate) generation: u64,
}
pub(crate) struct AttemptGuard {
pub(crate) selected: bool,
pub(crate) waiting: bool,
pub(crate) generation: u64,
cancel: Option<CancelToken>,
}
impl AttemptGuard {
pub(crate) const fn new(generation: u64, cancel: CancelToken) -> Self {
Self {
generation,
waiting: true,
cancel: Some(cancel),
selected: false,
}
}
pub(crate) fn disarm(&mut self) {
self.cancel = None;
}
pub(crate) fn is_cancelled(&self) -> bool {
self.cancel.as_ref().is_none_or(CancelToken::is_cancelled)
}
}
impl Drop for AttemptGuard {
fn drop(&mut self) {
if let Some(cancel) = self.cancel.take() {
cancel.cancel();
}
}
}
#[cfg(test)]
mod tests {
use kithara_test_utils::kithara;
use super::*;
#[kithara::test]
fn drop_cancels_armed_guard() {
let token = CancelToken::never().child();
drop(AttemptGuard::new(0, token.clone()));
assert!(token.is_cancelled());
}
#[kithara::test]
fn drop_after_disarm_cancels_nothing() {
let token = CancelToken::never().child();
let mut guard = AttemptGuard::new(0, token.clone());
guard.disarm();
drop(guard);
assert!(!token.is_cancelled());
}
}