use std::time::SystemTime;
use crate::tasks::{
error::TaskError,
event::TaskTerminateReason,
state::{ProcessState, TaskState},
};
pub trait TaskControl {
fn terminate_task(&mut self, reason: TaskTerminateReason) -> Result<(), TaskError>;
#[cfg(all(feature = "signal", unix))]
fn send_signal(&self, signal: nix::sys::signal::Signal) -> Result<(), TaskError>;
}
pub trait TaskStatusInfo {
fn get_task_state(&self) -> TaskState;
#[cfg(feature = "process-control")]
fn get_process_state(&self) -> ProcessState;
fn get_process_id(&self) -> Option<u32>;
fn get_create_at(&self) -> SystemTime;
fn get_running_at(&self) -> Option<SystemTime>;
fn get_finished_at(&self) -> Option<SystemTime>;
fn get_exit_code(&self) -> Option<i32>;
#[cfg(unix)]
fn get_last_signal_code(&self) -> Option<nix::sys::signal::Signal>;
fn get_information(&self) -> TaskInformation {
TaskInformation {
task_state: self.get_task_state(),
#[cfg(feature = "process-control")]
process_state: self.get_process_state(),
process_id: self.get_process_id(),
created_at: self.get_create_at(),
running_at: self.get_running_at(),
finished_at: self.get_finished_at(),
exit_code: self.get_exit_code(),
#[cfg(unix)]
last_signal: self.get_last_signal_code(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, PartialEq)]
pub struct TaskInformation {
pub task_state: TaskState,
#[cfg(feature = "process-control")]
pub process_state: ProcessState,
pub process_id: Option<u32>,
pub created_at: SystemTime,
pub running_at: Option<SystemTime>,
pub finished_at: Option<SystemTime>,
pub exit_code: Option<i32>,
#[cfg(unix)]
#[cfg_attr(
feature = "serde",
serde(
serialize_with = "crate::tasks::signal::serialize_signal",
deserialize_with = "crate::tasks::signal::deserialize_signal"
)
)]
pub last_signal: Option<nix::sys::signal::Signal>,
}