auric 0.1.0

CLI for the `auric` MVC SPA framework
use clap::Parser;
use std::{fs, path::Path};

#[derive(Debug, Parser)]
pub struct Opts {
    /// Route Name
    #[arg(value_name = "name")]
    pub name: String,
}

pub async fn run(name: String) -> anyhow::Result<()> {
    // Delete route module file
    let root_dir = Path::new(".");
    let routes_dir = root_dir.join("src").join("routes");
    let modulename = change_case::snake_case(&name);
    let filename = format!("{modulename}.rs");
    let path = routes_dir.join(filename);
    if path.exists() {
        fs::remove_file(path)?;
    }

    // Remove reference to it from the parent module
    let path = routes_dir.join("mod.rs");
    let code = fs::read_to_string(&path)?;
    let new_code = code.replace(&format!("pub mod {modulename};\n"), "");
    if code != new_code {
        fs::write(&path, new_code)?;
    }

    // Delete template
    let templates_dir = root_dir.join("src").join("templates");
    let mut template_dir = templates_dir.clone();
    let segments: Vec<_> = name.split('.').collect();
    let short = segments.last().cloned().unwrap_or_default();
    for segment in segments.into_iter().rev().skip(1).rev() {
        template_dir = template_dir.join(segment);
    }
    let path = template_dir.join(format!("{short}.hbs"));
    if path.exists() {
        fs::remove_file(path)?;
    }

    Ok(())
}