use crate::core::job::Job;
use anyhow::Result;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ExecutionResult {
pub job_id: u32,
pub exit_code: Option<i32>,
pub signal: Option<i32>,
}
impl ExecutionResult {
pub fn succeeded(self) -> bool {
self.exit_code == Some(0) && self.signal.is_none()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ExecutionStatus {
Running,
Finished(ExecutionResult),
Missing,
}
pub trait Executor: Send + Sync {
fn execute(&self, job: &Job) -> Result<()>;
fn kind(&self) -> &'static str {
"unknown"
}
fn terminate(&self, _job_id: u32, _run_name: Option<&str>) -> Result<()> {
Ok(())
}
fn execution_status(&self, job_id: u32, run_name: Option<&str>) -> ExecutionStatus {
if self.is_running(job_id, run_name) {
ExecutionStatus::Running
} else {
ExecutionStatus::Missing
}
}
fn is_running(&self, _job_id: u32, _run_name: Option<&str>) -> bool {
true
}
fn collect_finished(&self) -> Vec<ExecutionResult> {
Vec::new()
}
fn cleanup(&self, _job: &Job) {}
fn shutdown(&self) {}
}