use std::process::ExitStatus;
use std::sync::atomic::AtomicU64;
use std::sync::atomic::Ordering;
use bytes::Bytes;
use nonempty::NonEmpty;
use tokio_util::sync::CancellationToken;
pub type TaskId = u64;
pub fn next_task_id() -> TaskId {
static NEXT_TASK_ID: AtomicU64 = AtomicU64::new(0);
NEXT_TASK_ID.fetch_add(1, Ordering::SeqCst)
}
#[derive(Debug, Clone)]
pub enum Event {
TaskCreated {
id: TaskId,
name: String,
tes_id: Option<String>,
token: CancellationToken,
},
TaskStarted {
id: TaskId,
},
TaskContainerCreated {
id: TaskId,
container: String,
},
TaskContainerExited {
id: TaskId,
container: String,
exit_status: ExitStatus,
},
TaskCompleted {
id: TaskId,
exit_statuses: NonEmpty<ExitStatus>,
},
TaskFailed {
id: TaskId,
message: String,
},
TaskCanceled {
id: TaskId,
},
TaskPreempted {
id: TaskId,
},
TaskStdout {
id: TaskId,
message: Bytes,
},
TaskStderr {
id: TaskId,
message: Bytes,
},
ImagePullStarted {
id: TaskId,
name: String,
},
ImagePullFailed {
id: TaskId,
name: String,
message: String,
},
ImagePullFinished {
id: TaskId,
name: String,
},
}
#[macro_export]
macro_rules! send_event {
($sender:expr, $event:expr $(,)?) => {
if let Some(sender) = &$sender {
sender.send($event).ok();
}
};
}