spawn-cli 0.9.0

A command-line tool for creating files and folders from a template.
use anyhow::Result;
use log::info;
use std::{
    env::{self, set_current_dir},
    path::PathBuf,
    str::FromStr,
};

use crate::{config::Config, processor::Processor, template::Template, writer::Writer};

pub(crate) fn spawn(config: &Config, uri: String) -> Result<()> {
    let uri = config.resolve_alias(uri);

    info!("Using template {uri:?}");

    let template = Template::new(uri).init()?;
    let plugins = template.get_plugins()?;
    let template_info = template.get_info()?;
    let template_info = plugins.info(template_info.map(String::as_str))?;

    if let Some(template_info) = template_info {
        println!("{template_info}");
    }

    cliclack::intro(console::style(" SPWN ").on_cyan().black().bold())?;

    let cwd = env::current_dir()?;
    let cwd = plugins.cwd(&cwd.to_string_lossy())?;
    let cwd = PathBuf::from_str(&cwd)?;

    set_current_dir(&cwd)?;

    info!("The current directory is {cwd:?}");

    let processor = Processor::from_template(&template);
    let process_result = processor.process(&cwd)?;

    process_result.log()?;

    let writer = Writer::from_process_result(&process_result);

    writer.write()?;

    cliclack::outro("Done!")?;

    Ok(())
}