captain-workflow-manager 0.1.0

Run and manage jobs that depend on each other on a variety of backends.s
Documentation
use crate::ExpandedDescr;

use super::*;
pub struct DryRunExecutorBuilder {}

impl ExecutorBuilder for DryRunExecutorBuilder {
    type Executor = DryRunExecutor;

    fn init<J: JobUnit>(
        self,
    ) -> (
        Self::Executor,
        Sender<ToRun<J>>,
        Sender<ExecutorResult>,
        Receiver<ExecutorResult>,
    ) {
        let to_run_chan = crossbeam_channel::unbounded::<ToRun<J>>();
        let done_chan = crossbeam_channel::unbounded();
        let thread_handle = {
            let rcvr = to_run_chan.1.clone();
            let sndr = done_chan.0.clone();
            thread::Builder::new()
                .spawn(move || {
                    for to_run in rcvr.into_iter() {
                        let j_idx = to_run.job_idx;

                        let stdout = io::stdout();
                        {
                            let mut lock = stdout.lock();
                            write!(lock, "Would submit job: {:#?} interpreted as: {:#?} ", to_run.job_unit, ExpandedDescr(to_run.job_unit())).unwrap();
                            writeln!(lock, "\n").unwrap();
                        }

                        sndr.send(ExecutorResult::new_ok(j_idx)).unwrap()
                    }
                })
                .unwrap()
        };
        (
            DryRunExecutor {
                thread: thread_handle,
            },
            to_run_chan.0,
            done_chan.0,
            done_chan.1,
        )
    }
}

pub struct DryRunExecutor {
    thread: JoinHandle<()>,
}

impl Executor for DryRunExecutor {
    fn join(self) -> Vec<std::thread::Result<()>> {
        vec![self.thread.join()]
    }
}