gitm 0.4.3

Git manager is a nice wrapper to git, where it manages repos in a specified directory
Documentation
use std::{
  fs,
  io::{self, Write},
  path::Path,
};

use clier::{
  display::{label::LabelLogger, Displayer},
  hooks::{use_flag, FlagError},
  run::ExitCode,
  Clier, HasMeta, Runnable,
};

use crate::config;

fn handle_err(err: FlagError) {
  let log = LabelLogger::default();
  match err {
    FlagError::Unexisting => {
      log.error("flag 'name' is required");
    }
    FlagError::InvalidFormat => {
      log.error("flag 'name' is required to be a string");
    }
    _ => {
      log.error("flag 'name' is invalid");
    }
  };
}

fn get_input_incase_not_yes() -> Option<bool> {
  let mut buffer = String::new();

  io::stdin().read_line(&mut buffer).ok()?;

  match buffer.trim().to_lowercase().as_str() {
    "yes" | "y" => Some(true),
    "no" | "n" => Some(false),
    _ => None,
  }
}
fn ensure_put_folder(name: &str) {
  let path = Path::new(name);

  if !path.exists() {
    dbg!("path doesnt exist");
  }
}

pub fn remove_command(clier: Clier<HasMeta, Runnable>) -> ExitCode {
  let log = LabelLogger::default();
  let config = config::load_config();

  let project_name: String = match use_flag("name", None, &clier).try_into() {
    Ok(value) => value,
    Err(err) => {
      handle_err(err);
      return ExitCode(1);
    }
  };

  let project_dir = format!("{}/{project_name}", &config.project_directory);

  ensure_put_folder(&project_dir);

  let yes_flag: Option<bool> = use_flag("yes", Some('y'), &clier).try_into().ok();

  let do_it: Option<bool> = match yes_flag {
    Some(value) => Some(value),
    None => {
      log.warn("THIS WILL REMOVE ALL FILES AND DIRECTORIES UNDER THIS PATH");

      print!("Are you sure you want to delete this directory? (yes/no or y/n): ");
      let mut stdout = std::io::stdout();
      stdout.flush().expect("Unable to flush stdout");
      get_input_incase_not_yes()
    }
  };

  if do_it.is_some_and(|value| !value) || do_it.is_none() {
    log.error("yes was not provided");
    return ExitCode(1);
  }

  match fs::remove_dir_all(&project_dir) {
    Ok(_) => {
      log.info(&format!("Directory {} has been removed", project_dir));
    }
    Err(err) => {
      log.error(&format!("unknown err: {err:#?}"));
    }
  }

  ExitCode(0)
}