use std::{collections::HashMap, path::PathBuf};
use anyhow::{Context, Result};
use clap::{Args, Subcommand};
use serde_json::json;
use wash_lib::{
cli::CommandOutput,
generate::{generate_project, Project, ProjectKind},
};
#[derive(Debug, Clone, Subcommand)]
pub enum NewCliCommand {
#[clap(name = "component")]
Component(NewProjectArgs),
#[clap(name = "provider")]
Provider(NewProjectArgs),
}
#[derive(Args, Debug, Default, Clone)]
pub struct NewProjectArgs {
#[clap(help = "Project name")]
pub project_name: Option<String>,
#[clap(long)]
pub git: Option<String>,
#[clap(long, alias = "subdir")]
pub subfolder: Option<String>,
#[clap(long)]
pub branch: Option<String>,
#[clap(short, long)]
pub path: Option<PathBuf>,
#[clap(short, long)]
pub values: Option<PathBuf>,
#[clap(long)]
pub silent: bool,
#[clap(long)]
pub favorites: Option<PathBuf>,
#[clap(short, long)]
pub template_name: Option<String>,
#[clap(long)]
pub no_git_init: bool,
}
impl From<NewCliCommand> for Project {
fn from(cmd: NewCliCommand) -> Project {
let (args, kind) = match cmd {
NewCliCommand::Component(args) => (args, ProjectKind::Component),
NewCliCommand::Provider(args) => (args, ProjectKind::Provider),
};
Project {
kind,
project_name: args.project_name,
values: args.values,
silent: args.silent,
favorites: args.favorites,
template_name: args.template_name,
no_git_init: args.no_git_init,
path: args.path,
git: args.git,
subfolder: args.subfolder,
branch: args.branch,
}
}
}
pub async fn handle_command(cmd: NewCliCommand) -> Result<CommandOutput> {
generate_project(cmd.into())
.await
.map(|path| CommandOutput {
map: HashMap::from([(
"project_path".to_string(),
json!(path.to_string_lossy().to_string()),
)]),
text: format!(
"Project generated and is located at: {}",
path.to_string_lossy()
),
})
.context("Failed to generate project")
}