mod create_project;
mod enums;
use std::path::PathBuf;
use anyhow::anyhow;
use clap::Parser;
pub use create_project::*;
pub use enums::*;
use path_clean::PathClean;
use crate::{logo, plugin::create_instance};
#[derive(Debug, Clone, clap::Parser)]
#[clap(author, version, about, long_about = None)]
pub enum Cli {
New {
name: String,
#[arg(short, long, default_value = "exe")]
template: TemplateType,
#[arg(short, long, default_value = ".")]
path: PathBuf,
},
Init {
#[arg(short, long, default_value = "exe")]
template: TemplateType,
#[arg(short, long, default_value = ".")]
path: PathBuf,
},
Build,
Run,
Clean,
Install,
Uninstall,
Pack,
Publish,
List,
Logo,
}
impl Cli {
pub fn new() -> Self {
let mut cli = Cli::parse();
let base_path = std::env::current_dir().unwrap();
macro_rules! to_abs_path {
($($t: tt)*) => {
if let $($t)* { ref mut path, .. } = cli {
if path.is_relative() {
*path = base_path.join(&path).clean();
}
}
};
}
to_abs_path!(Self::New);
to_abs_path!(Self::Init);
cli
}
pub fn dispatch(self) -> anyhow::Result<()> {
match self {
Cli::Logo => logo(),
Cli::New {
name,
template,
path,
} => {
let plugin = create_instance(template);
let project_path = path.join(&name);
if project_path.exists() {
return Err(anyhow!(
"Directory or file {} already exists!",
project_path.clean().display()
));
}
fs_err::create_dir_all(&project_path)?;
let result = plugin.create_project(&name, &project_path);
if let Err(e) = result {
fs_err::remove_dir_all(&project_path)?;
return Err(e);
}
}
Cli::Init { template, path } => {
let plugin = create_instance(template);
if !path.exists() {
return Err(anyhow!(
"Directory {} does not exist!",
path.clean().display()
));
}
if !path.is_dir() {
return Err(anyhow!("{} is not a directory!", path.clean().display()));
}
if fs_err::read_dir(&path)?.next().is_some() {
return Err(anyhow!(
"Directory {} is not empty!",
path.clean().display()
));
}
let name = path.file_name().unwrap().to_str().unwrap();
let result = plugin.create_project(name, &path);
if let Err(e) = result {
fs_err::remove_dir_all(&path)?;
fs_err::create_dir(path)?;
return Err(e);
}
}
_ => todo!(),
};
Ok(())
}
}