razel 0.5.7

a command executor with caching for data processing pipelines
Documentation
use crate::executors::ExecutionResult;
use async_trait::async_trait;
use std::path::PathBuf;
use std::sync::Arc;
use std::time::Instant;

pub type TaskFn = Arc<dyn Fn() -> Result<(), anyhow::Error> + Send + Sync>;

#[derive(Clone)]
pub struct BlockingTaskExecutor {
    pub f: TaskFn,
    pub args: Vec<String>,
}

impl BlockingTaskExecutor {
    pub async fn exec(&self) -> ExecutionResult {
        let execution_start = Instant::now();
        let result = (self.f)();
        ExecutionResult::for_task(result, execution_start)
    }

    pub fn args_with_executable(&self) -> Vec<String> {
        self.args.clone()
    }
}

#[derive(Clone)]
pub struct AsyncTaskExecutor {
    pub task: Arc<dyn AsyncTask + Send + Sync>,
    pub args: Vec<String>,
}

impl AsyncTaskExecutor {
    pub async fn exec(&self, sandbox_dir: Option<PathBuf>) -> ExecutionResult {
        let execution_start = Instant::now();
        let result = self.task.exec(sandbox_dir).await;
        ExecutionResult::for_task(result, execution_start)
    }

    pub fn args_with_executable(&self) -> Vec<String> {
        self.args.clone()
    }
}

#[async_trait]
pub trait AsyncTask {
    async fn exec(&self, sandbox_dir: Option<PathBuf>) -> Result<(), anyhow::Error>;
}