1use std::{collections::HashMap, path::PathBuf};
2
3use anyhow::{Context, Result};
4use clap::{Args, Subcommand};
5use serde_json::json;
6use wash_lib::{
7 cli::CommandOutput,
8 generate::{generate_project, Project, ProjectKind},
9};
10
11#[derive(Debug, Clone, Subcommand)]
13pub enum NewCliCommand {
14 #[clap(name = "component")]
16 Component(NewProjectArgs),
17
18 #[clap(name = "provider")]
20 Provider(NewProjectArgs),
21}
22
23#[derive(Args, Debug, Default, Clone)]
24pub struct NewProjectArgs {
25 #[clap(help = "Project name")]
27 pub project_name: Option<String>,
28
29 #[clap(long)]
31 pub git: Option<String>,
32
33 #[clap(long, alias = "subdir")]
35 pub subfolder: Option<String>,
36
37 #[clap(long)]
39 pub branch: Option<String>,
40
41 #[clap(short, long)]
43 pub path: Option<PathBuf>,
44
45 #[clap(short, long)]
47 pub values: Option<PathBuf>,
48
49 #[clap(long)]
52 pub silent: bool,
53
54 #[clap(long)]
56 pub favorites: Option<PathBuf>,
57
58 #[clap(short, long)]
60 pub template_name: Option<String>,
61
62 #[clap(long)]
64 pub no_git_init: bool,
65}
66
67impl From<NewCliCommand> for Project {
68 fn from(cmd: NewCliCommand) -> Project {
69 let (args, kind) = match cmd {
70 NewCliCommand::Component(args) => (args, ProjectKind::Component),
71 NewCliCommand::Provider(args) => (args, ProjectKind::Provider),
72 };
73
74 Project {
75 kind,
76 project_name: args.project_name,
77 values: args.values,
78 silent: args.silent,
79 favorites: args.favorites,
80 template_name: args.template_name,
81 no_git_init: args.no_git_init,
82 path: args.path,
83 git: args.git,
84 subfolder: args.subfolder,
85 branch: args.branch,
86 }
87 }
88}
89
90pub async fn handle_command(cmd: NewCliCommand) -> Result<CommandOutput> {
91 generate_project(cmd.into())
92 .await
93 .map(|path| CommandOutput {
94 map: HashMap::from([(
95 "project_path".to_string(),
96 json!(path.to_string_lossy().to_string()),
97 )]),
98 text: format!(
99 "Project generated and is located at: {}",
100 path.to_string_lossy()
101 ),
102 })
103 .context("Failed to generate project")
104}