use std::fmt::{Display, Formatter, Result as FmtResult};
use valuable::Valuable;
#[derive(Copy, Clone, Debug, Hash, PartialOrd, Ord, PartialEq, Eq, Valuable)]
#[repr(transparent)]
pub struct ThreadOrTokioTaskId(pub u64);
impl Display for ThreadOrTokioTaskId {
fn fmt(&self, fmt: &mut Formatter<'_>) -> FmtResult {
write!(fmt, "{}", self.0)
}
}
#[derive(Copy, Clone, Debug, Hash, PartialOrd, Ord, PartialEq, Eq, Valuable)]
#[repr(transparent)]
pub struct LisaTaskId(pub u64);
impl Display for LisaTaskId {
fn fmt(&self, fmt: &mut Formatter<'_>) -> FmtResult {
write!(fmt, "{}", self.0)
}
}
pub type GloballyUniqueTaskId = (ThreadOrTokioTaskId, LisaTaskId);
#[derive(Clone, Debug, PartialEq, Eq, Valuable)]
pub enum LisaTaskStatus {
Inactive,
Running(Option<String>),
Waiting(Option<String>),
}
impl Display for LisaTaskStatus {
fn fmt(&self, fmt: &mut Formatter<'_>) -> FmtResult {
write!(
fmt,
"{}",
match self {
LisaTaskStatus::Inactive => {
"inactive".to_owned()
}
LisaTaskStatus::Running(reason) =>
if let Some(real_reason) = reason {
format!("running/doing={real_reason}")
} else {
"running".to_owned()
},
LisaTaskStatus::Waiting(reason) =>
if let Some(real_reason) = reason {
format!("waiting/on={real_reason}")
} else {
"waiting".to_owned()
},
},
)
}
}
#[derive(Clone, Debug, PartialEq, Eq, Valuable)]
pub enum TaskEvent {
TaskStart(ThreadOrTokioTaskId, LisaTaskId, String, LisaTaskStatus),
TaskStatusUpdate(ThreadOrTokioTaskId, LisaTaskId, LisaTaskStatus),
TaskEnd(ThreadOrTokioTaskId, LisaTaskId),
}
pub trait TaskEventLogProvider: Send + Sync {
#[must_use]
fn new_events(&self) -> Vec<TaskEvent>;
}