arpx 0.5.0

Small-scale process orchestration
Documentation
use crate::runtime::{
    ctx::Ctx,
    job::task::{log_monitor::LogMonitor, process::Process},
};
use log::debug;

pub const BUILTIN_ACTIONS: [&str; 2] = ["arpx_exit", "arpx_exit_error"];

pub struct ProcessActions {
    pub onfail: OptionalAction,
    pub onsucceed: OptionalAction,
}

pub type OptionalAction = Option<Box<dyn Fn() + Send>>;

pub fn get_process_actions(process: &Process, ctx: &Ctx) -> ProcessActions {
    let onfail = match &process.onfail {
        Some(action_name) => get_optional_action(action_name.into(), ctx.clone()),
        None => None,
    };
    let onsucceed = match &process.onsucceed {
        Some(action_name) => get_optional_action(action_name.into(), ctx.clone()),
        None => None,
    };

    ProcessActions { onfail, onsucceed }
}

pub fn get_log_monitor_action(log_monitor: &LogMonitor, ctx: &Ctx) -> OptionalAction {
    get_optional_action(log_monitor.ontrigger.clone(), ctx.clone())
}

fn get_optional_action(action_name: String, ctx: Ctx) -> OptionalAction {
    if BUILTIN_ACTIONS.contains(&&action_name[..]) {
        return Some(Box::new(move || execute_action(&action_name[..])));
    }

    match ctx.clone().process_map.get(&action_name[..]) {
        Some(process) => {
            let cloned_process = process.clone();

            Some(Box::new(move || {
                let process_actions = get_process_actions(&cloned_process, &ctx);

                cloned_process.run(process_actions, &ctx, &[]).ok();
            }))
        }
        None => None,
    }
}

fn execute_action(action: &str) {
    match action {
        "arpx_exit" => {
            debug!("Received builtin action \"arpx_exit\". Exiting runtime.");
            std::process::exit(0)
        }
        "arpx_exit_error" => {
            debug!(
                "Received builtin action \"arpx_exit_error\". Exiting runtime with error status."
            );
            std::process::exit(1)
        }
        _ => {
            debug!("Unknown builtin action received. Doing nothing.");
        }
    }
}