use crate::hub::domain::common::errors::HubResult;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TaskStatus {
Pending,
Running,
Completed,
Failed,
}
pub struct TaskResult {
pub task_id: String,
pub status: TaskStatus,
pub output: Option<String>,
pub error: Option<String>,
pub elapsed_ms: f64,
}
pub struct Executor {
max_retries: usize,
}
impl Executor {
pub fn new() -> Self {
Self { max_retries: 0 }
}
pub fn with_retries(mut self, retries: usize) -> Self {
self.max_retries = retries;
self
}
pub fn execute<F>(&self, task_id: &str, f: F) -> TaskResult
where
F: Fn() -> HubResult<String>,
{
let start = std::time::Instant::now();
let mut last_err = None;
for _ in 0..=self.max_retries {
match f() {
Ok(output) => {
return TaskResult {
task_id: task_id.to_string(),
status: TaskStatus::Completed,
output: Some(output),
error: None,
elapsed_ms: start.elapsed().as_secs_f64() * 1000.0,
};
}
Err(e) => {
last_err = Some(e);
}
}
}
TaskResult {
task_id: task_id.to_string(),
status: TaskStatus::Failed,
output: None,
error: last_err.map(|e| e.to_string()),
elapsed_ms: start.elapsed().as_secs_f64() * 1000.0,
}
}
}
impl Default for Executor {
fn default() -> Self {
Self::new()
}
}