releez 1.0.3

An utility tool to run application release-checklist safely.
Documentation
use crate::prelude::*;
use crate::utils::system_val_resolver::resolve_system_dependent_value_config;
use serde::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ReleaseConfig {
    pub version: String,
    pub checklist: Vec<Task>,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Task {
    pub name: String,
    #[serde(rename = "type")]
    pub task_type: TaskType,
    pub instructions: Option<Value>,
    pub run: Option<Value>,
    pub confirm: Option<String>,
    #[serde(skip)]
    sub_tasks: Vec<String>,
}

#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
pub enum TaskType {
    #[serde(rename = "manual")]
    Manual,
    #[serde(rename = "auto")]
    Auto,
}

impl ReleaseConfig {
    pub fn parse(config_text: &str) -> crate::Result<ReleaseConfig> {
        let mut config = serde_yaml::from_str::<ReleaseConfig>(config_text).wrap()?;

        for task in config.checklist.iter_mut() {
            let val = match task.task_type {
                TaskType::Auto => task.run.as_ref(),
                TaskType::Manual => task.instructions.as_ref(),
            };

            if let Some(val) = val {
                task.sub_tasks = resolve_system_dependent_value_config(val);
            } else {
                task.sub_tasks = Vec::new();
            }
        }

        Ok(config)
    }
}

impl Task {
    pub fn sub_tasks(&self) -> &Vec<String> {
        &self.sub_tasks
    }
}