use cargo_generate::{generate, GenerateArgs, TemplatePath};
use clap::{ArgGroup, Args};
use crate::internal_prelude::*;
#[derive(Clone, Debug, Args, PartialEq, Eq)]
#[clap(arg_required_else_help(true))]
#[clap(group(ArgGroup::new("template").args(&["git", "path"]).required(true).multiple(false)))]
#[clap(about)]
pub struct NewCommand {
#[clap(short, long, group = "git-arg")]
pub git: Option<String>,
#[clap(short, long, conflicts_with = "tag", requires = "git-arg")]
pub branch: Option<String>,
#[clap(short, long, conflicts_with = "branch", requires = "git-arg")]
pub tag: Option<String>,
#[clap(short, long)]
pub path: Option<String>,
#[clap(long, short, value_parser)]
pub name: Option<String>,
#[clap(long, short, action)]
pub force: bool,
#[clap(long, short, action)]
pub verbose: bool,
#[clap(long, action)]
pub init: bool,
}
impl NewCommand {
pub fn run(self) -> Result<()> {
let Self {
git,
branch,
tag,
path,
name,
force,
verbose,
init,
} = self;
let args = GenerateArgs {
template_path: TemplatePath {
git: absolute_git_url(git),
branch,
tag,
path,
..Default::default()
},
name,
force,
verbose,
init,
..Default::default()
};
generate(args).dot_anyhow()?;
Ok(())
}
}
fn absolute_git_url(url: Option<String>) -> Option<String> {
url.map(|url| match url.as_str() {
"start-trunk" | "leptos-rs/start-trunk" => format_leptos_starter_url("start-trunk"),
"start-actix" | "leptos-rs/start" | "leptos-rs/start-actix" => {
format_leptos_starter_url("start-actix")
}
"start-axum" | "leptos-rs/start-axum" => format_leptos_starter_url("start-axum"),
"start-axum-workspace" | "leptos-rs/start-axum-workspace" => {
format_leptos_starter_url("start-axum-workspace")
}
"start-aws" | "leptos-rs/start-aws" => format_leptos_starter_url("start-aws"),
"start-spin" | "leptos-rs/start-spin" => format_leptos_starter_url("start-spin"),
_ => url,
})
}
fn format_leptos_starter_url(repo: &str) -> String {
format!("https://github.com/leptos-rs/{repo}")
}