1use std::path::PathBuf;
4
5use clap::{Args, Parser, Subcommand};
6
7#[derive(Parser, Debug)]
8#[command(name = "greentic-setup")]
9#[command(version)]
10#[command(about = "Greentic bundle setup CLI")]
11#[command(after_help = r#"EXAMPLES:
12 Interactive wizard:
13 greentic-setup ./my-bundle
14
15 Preview without executing:
16 greentic-setup --dry-run ./my-bundle
17
18 Generate answers template:
19 greentic-setup --dry-run --emit-answers answers.json ./my-bundle
20
21 Apply answers file:
22 greentic-setup --answers answers.json ./my-bundle.gtbundle
23
24 Advanced (bundle subcommands):
25 greentic-setup bundle init ./my-bundle
26 greentic-setup bundle add pack.gtpack --bundle ./my-bundle
27 greentic-setup bundle status --bundle ./my-bundle
28"#)]
29pub struct Cli {
30 #[arg(value_name = "BUNDLE")]
32 pub bundle: Option<PathBuf>,
33
34 #[arg(long = "dry-run", global = true)]
36 pub dry_run: bool,
37
38 #[arg(long = "emit-answers", value_name = "FILE", global = true)]
40 pub emit_answers: Option<PathBuf>,
41
42 #[arg(long = "answers", short = 'a', value_name = "FILE", global = true)]
44 pub answers: Option<PathBuf>,
45
46 #[arg(long = "key", value_name = "KEY", global = true)]
48 pub key: Option<String>,
49
50 #[arg(long = "tenant", short = 't', default_value = "demo", global = true)]
52 pub tenant: String,
53
54 #[arg(long = "team", global = true)]
56 pub team: Option<String>,
57
58 #[arg(long = "env", short = 'e', default_value = "dev", global = true)]
60 pub env: String,
61
62 #[arg(long = "locale", global = true)]
64 pub locale: Option<String>,
65
66 #[arg(long = "advanced", global = true)]
68 pub advanced: bool,
69
70 #[arg(long = "ui", global = true)]
72 pub ui: bool,
73
74 #[command(subcommand)]
75 pub command: Option<Command>,
76}
77
78#[derive(Subcommand, Debug)]
79pub enum Command {
80 #[command(subcommand)]
82 Bundle(BundleCommand),
83}
84
85#[derive(Subcommand, Debug, Clone)]
86pub enum BundleCommand {
87 Init(BundleInitArgs),
89 Add(BundleAddArgs),
91 Setup(BundleSetupArgs),
93 Update(BundleSetupArgs),
95 Remove(BundleRemoveArgs),
97 Build(BundleBuildArgs),
99 List(BundleListArgs),
101 Status(BundleStatusArgs),
103}
104
105#[derive(Args, Debug, Clone)]
106pub struct BundleInitArgs {
107 #[arg(value_name = "PATH")]
109 pub path: Option<PathBuf>,
110 #[arg(long = "name", short = 'n')]
112 pub name: Option<String>,
113}
114
115#[derive(Args, Debug, Clone)]
116pub struct BundleAddArgs {
117 #[arg(value_name = "PACK_REF")]
119 pub pack_ref: String,
120 #[arg(long = "bundle", short = 'b')]
122 pub bundle: Option<PathBuf>,
123 #[arg(long = "tenant", short = 't', default_value = "demo")]
125 pub tenant: String,
126 #[arg(long = "team")]
128 pub team: Option<String>,
129 #[arg(long = "env", short = 'e', default_value = "dev")]
131 pub env: String,
132 #[arg(long = "dry-run")]
134 pub dry_run: bool,
135}
136
137#[derive(Args, Debug, Clone)]
138pub struct BundleSetupArgs {
139 #[arg(value_name = "PROVIDER_ID")]
141 pub provider_id: Option<String>,
142 #[arg(long = "bundle", short = 'b')]
144 pub bundle: Option<PathBuf>,
145 #[arg(long = "answers", short = 'a')]
147 pub answers: Option<PathBuf>,
148 #[arg(long = "key", value_name = "KEY")]
150 pub key: Option<String>,
151 #[arg(long = "tenant", short = 't', default_value = "demo")]
153 pub tenant: String,
154 #[arg(long = "team")]
156 pub team: Option<String>,
157 #[arg(long = "env", short = 'e', default_value = "dev")]
159 pub env: String,
160 #[arg(long = "domain", short = 'd', default_value = "all")]
162 pub domain: String,
163 #[arg(long = "parallel", default_value = "1")]
165 pub parallel: usize,
166 #[arg(long = "backup")]
168 pub backup: bool,
169 #[arg(long = "skip-secrets-init")]
171 pub skip_secrets_init: bool,
172 #[arg(long = "best-effort")]
174 pub best_effort: bool,
175 #[arg(long = "non-interactive")]
177 pub non_interactive: bool,
178 #[arg(long = "dry-run")]
180 pub dry_run: bool,
181 #[arg(long = "emit-answers")]
183 pub emit_answers: Option<PathBuf>,
184 #[arg(long = "advanced")]
186 pub advanced: bool,
187}
188
189#[derive(Args, Debug, Clone)]
190pub struct BundleRemoveArgs {
191 #[arg(value_name = "PROVIDER_ID")]
193 pub provider_id: String,
194 #[arg(long = "bundle", short = 'b')]
196 pub bundle: Option<PathBuf>,
197 #[arg(long = "tenant", short = 't', default_value = "demo")]
199 pub tenant: String,
200 #[arg(long = "team")]
202 pub team: Option<String>,
203 #[arg(long = "force", short = 'f')]
205 pub force: bool,
206}
207
208#[derive(Args, Debug, Clone)]
209pub struct BundleBuildArgs {
210 #[arg(long = "bundle", short = 'b')]
212 pub bundle: Option<PathBuf>,
213 #[arg(long = "out", short = 'o')]
215 pub out: PathBuf,
216 #[arg(long = "tenant", short = 't')]
218 pub tenant: Option<String>,
219 #[arg(long = "team")]
221 pub team: Option<String>,
222 #[arg(long = "only-used-providers")]
224 pub only_used_providers: bool,
225 #[arg(long = "doctor")]
227 pub doctor: bool,
228 #[arg(long = "skip-doctor")]
230 pub skip_doctor: bool,
231}
232
233#[derive(Args, Debug, Clone)]
234pub struct BundleListArgs {
235 #[arg(long = "bundle", short = 'b')]
237 pub bundle: Option<PathBuf>,
238 #[arg(long = "domain", short = 'd', default_value = "messaging")]
240 pub domain: String,
241 #[arg(long = "pack", short = 'p')]
243 pub pack: Option<String>,
244 #[arg(long = "format", default_value = "text")]
246 pub format: String,
247}
248
249#[derive(Args, Debug, Clone)]
250pub struct BundleStatusArgs {
251 #[arg(long = "bundle", short = 'b')]
253 pub bundle: Option<PathBuf>,
254 #[arg(long = "format", default_value = "text")]
256 pub format: String,
257}