cnctd_cli 0.3.0

CLI for scaffolding and managing projects
use std::fmt;

use async_recursion::async_recursion;
use cnctd_dialogue::Dialog;
use cnctd_utils::display_logo;
use local_dependencies::LocalDependencies;
use serde::{Deserialize, Serialize};
use strum_macros::EnumIter;

pub mod local_dependencies;

#[derive(Debug, Deserialize, Serialize, Clone, EnumIter, Default, PartialEq)]
enum MainOptions {
    #[default]
    LocalDependencies,
    Blank,
    Back,
    Exit,
}

impl fmt::Display for MainOptions {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let display_str = match self {
            Self::LocalDependencies => "Local Dependencies",
            Self::Blank => "- - - -",
            Self::Back => "Back",
            Self::Exit => "Exit",
        };
        write!(f, "{}", display_str)
    }
}

pub struct Scripts;

impl Scripts {
    #[async_recursion]
    pub async fn launch_scripts_menu() -> anyhow::Result<()> {
        display_logo("scripts", false);
        let prompt = "Which script would you like to run?";
        let selected_option = Dialog::select::<MainOptions>(prompt, None, None, None);
    
        match selected_option {
            MainOptions::LocalDependencies => Self::local_dependencies().await?,
            MainOptions::Blank => Self::launch_scripts_menu().await?,
            MainOptions::Back => {},
            MainOptions::Exit => std::process::exit(0),
            
        }
        Ok(())
    }

    pub async fn local_dependencies() -> anyhow::Result<()> {
        Ok(LocalDependencies::run().await?)
    }
}