auric 0.1.5

CLI for the Ember-inspired Auric SPA framework
use anyhow::anyhow;
use change_case::{param_case as dasherized_case, snake_case};
use clap::Parser;
use std::fs::{self, File};
use std::io::Write;
use std::path::{Path, PathBuf};

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

pub async fn run(name: String) -> anyhow::Result<()> {
    // Validate
    if name != dasherized_case(&name) {
        return Err(anyhow!("Component names must be dasherized"));
    }

    // snake-case the template filename, so that a component's template and controller files
    // show up sequentially in a file listing.
    // eg:
    //   src/components/
    //     display_customer_summary.hbs
    //     display_customer_summary.rs
    //     edit_customer_form.hbs
    //     edit_customer_form.rs
    let name_snaked = snake_case(&name);
    let filename = format!("{name_snaked}.hbs");

    // Deploy the template file
    let components_dir = PathBuf::new().join("src").join("components");
    let root_dir = Path::new(".");
    fs::create_dir_all(root_dir.join(&components_dir))?;
    let relative_path = components_dir.join(filename);
    let path = root_dir.join(&relative_path);
    let mut file = File::create(&path)?;
    file.write_all("{{yield}}\n".as_bytes())?;
    eprintln!("created {}", relative_path.display());

    Ok(())
}