releez 1.0.3

An utility tool to run application release-checklist safely.
Documentation
use crate::constants;
use crate::out;
use crate::prelude::*;
use crate::types::{HaltConfig, ReleaseConfig, TaskType};
use semver::Version;
use std::path::Path;
use tokio::fs;

mod auto;
mod helpers;
mod manual;

pub async fn execute_checklist(
    release_config: &ReleaseConfig,
    halt_config: Option<&HaltConfig>,
    release_version: &Version,
    root_dir: &Path,
) -> crate::Result<()> {
    let vars_data = helpers::gen_vars_data(release_version);

    let (mut start_task_id, mut start_sub_task_id) =
        helpers::calculate_start_task_ids(release_config, halt_config).await;

    if start_task_id >= release_config.checklist.len() as u64 {
        start_task_id = 0;
        start_sub_task_id = 0;
    }

    out::print("\n").await?;

    for (idx, task) in release_config.checklist.iter().skip(start_task_id as usize).enumerate() {
        if idx != 0 {
            start_sub_task_id = 0;
        }

        match task.task_type {
            TaskType::Manual => {
                manual::execute_manual_task(
                    release_config,
                    idx as u64 + start_task_id,
                    task,
                    start_sub_task_id,
                    root_dir,
                    &vars_data,
                )
                .await?
            }
            TaskType::Auto => {
                auto::execute_auto_task(
                    release_config,
                    idx as u64 + start_task_id,
                    task,
                    start_sub_task_id,
                    root_dir,
                    &vars_data,
                )
                .await?
            }
        }
    }

    fs::remove_file(root_dir.join(constants::HALT_CONFIG_FILE_NAME))
        .await
        .context(format!(
            "Failed to remove the halt file: {}",
            constants::HALT_CONFIG_FILE_NAME
        ))?;

    Ok(())
}