use super::{commander::Commander, progress::ProgressTracker};
use crate::job::{Job, JobId};
use std::sync::Arc;
pub trait JobRepository {
fn execute(&mut self, goals: &[Box<str>]) -> Vec<Execution>;
fn select(&self, goals: &[Box<str>]) -> Vec<JobId>;
}
impl<T: JobRepository> JobRepository for &mut T {
fn execute(&mut self, goals: &[Box<str>]) -> Vec<Execution> {
T::execute(self, goals)
}
fn select(&self, goals: &[Box<str>]) -> Vec<JobId> {
T::select(self, goals)
}
}
#[derive(Debug, Clone)]
pub struct Execution {
job: Arc<Job>,
commander: Arc<dyn Commander + Send + Sync>,
progress: Arc<dyn ProgressTracker + Send + Sync>,
}
impl Execution {
pub fn new(
job: Arc<Job>,
commander: Arc<dyn Commander + Send + Sync>,
progress: Arc<dyn ProgressTracker + Send + Sync>,
) -> Self {
Self {
job,
commander,
progress,
}
}
pub fn job(&self) -> &Job {
&self.job
}
pub fn commander(&self) -> &dyn Commander {
self.commander.as_ref()
}
pub fn progress(&self) -> &dyn ProgressTracker {
self.progress.as_ref()
}
}