use std::time::Duration;
use serde::{Deserialize, Serialize};
use super::{FinishedTask, TaskInfo};
#[derive(Clone, Serialize, Deserialize)]
pub struct TaskEvent {
tinfo: TaskInfo,
ty: TaskEventType,
}
impl std::fmt::Display for TaskEvent {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} event:{}", self.tinfo(), self.ty)
}
}
impl PartialEq for TaskEvent {
fn eq(&self, other: &Self) -> bool {
self.tinfo == other.tinfo && self.ty == other.ty
}
}
impl TaskEvent {
pub fn tinfo(&self) -> TaskInfo {
self.tinfo.clone()
}
pub fn ty(&self) -> TaskEventType {
self.ty.clone()
}
pub fn start(tinfo: TaskInfo) -> Self {
Self {
tinfo,
ty: TaskEventType::Start,
}
}
pub fn wait(tinfo: TaskInfo) -> Self {
Self {
tinfo,
ty: TaskEventType::Wait,
}
}
pub fn time_out(tinfo: TaskInfo, deadline: Duration) -> Self {
Self {
tinfo,
ty: TaskEventType::Timeout(deadline),
}
}
pub fn finished(tinfo: TaskInfo, finished_task: FinishedTask) -> Self {
Self {
tinfo,
ty: TaskEventType::Finished(finished_task),
}
}
}
#[derive(Clone, Serialize, Deserialize)]
pub enum TaskEventType {
Start,
Wait,
Timeout(Duration),
Finished(FinishedTask),
}
impl std::fmt::Display for TaskEventType {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
TaskEventType::Start => write!(f, "start"),
TaskEventType::Wait => write!(f, "waiting"),
TaskEventType::Timeout(t) => write!(f, "timeout {}s", t.as_secs()),
TaskEventType::Finished(ft) => write!(f, "finished {}", ft),
}
}
}
impl PartialEq for TaskEventType {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(TaskEventType::Start, TaskEventType::Start)
| (TaskEventType::Wait, TaskEventType::Wait) => true,
(TaskEventType::Timeout(t1), TaskEventType::Timeout(t2)) => t1 == t2,
(TaskEventType::Finished(f1), TaskEventType::Finished(f2)) => f1 == f2,
_ => false,
}
}
}