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, default_value_t = true)]
73 pub ui: bool,
74
75 #[arg(long = "no-ui", global = true)]
77 pub no_ui: bool,
78
79 #[arg(long = "non-interactive", global = true)]
81 pub non_interactive: bool,
82
83 #[arg(long = "port", value_name = "PORT", global = true)]
85 pub port: Option<u16>,
86
87 #[command(subcommand)]
88 pub command: Option<Command>,
89}
90
91#[derive(Subcommand, Debug)]
92pub enum Command {
93 #[command(subcommand)]
95 Bundle(BundleCommand),
96}
97
98#[derive(Subcommand, Debug, Clone)]
99pub enum BundleCommand {
100 Init(BundleInitArgs),
102 Add(BundleAddArgs),
104 Setup(BundleSetupArgs),
106 Update(BundleSetupArgs),
108 Remove(BundleRemoveArgs),
110 Build(BundleBuildArgs),
112 List(BundleListArgs),
114 Status(BundleStatusArgs),
116}
117
118#[derive(Args, Debug, Clone)]
119pub struct BundleInitArgs {
120 #[arg(value_name = "PATH")]
122 pub path: Option<PathBuf>,
123 #[arg(long = "name", short = 'n')]
125 pub name: Option<String>,
126}
127
128#[derive(Args, Debug, Clone)]
129pub struct BundleAddArgs {
130 #[arg(value_name = "PACK_REF")]
132 pub pack_ref: String,
133 #[arg(long = "bundle", short = 'b')]
135 pub bundle: Option<PathBuf>,
136 #[arg(long = "tenant", short = 't', default_value = "demo")]
138 pub tenant: String,
139 #[arg(long = "team")]
141 pub team: Option<String>,
142 #[arg(long = "env", short = 'e', default_value = "dev")]
144 pub env: String,
145 #[arg(long = "dry-run")]
147 pub dry_run: bool,
148}
149
150#[derive(Args, Debug, Clone)]
151pub struct BundleSetupArgs {
152 #[arg(value_name = "PROVIDER_ID")]
154 pub provider_id: Option<String>,
155 #[arg(long = "bundle", short = 'b')]
157 pub bundle: Option<PathBuf>,
158 #[arg(long = "answers", short = 'a')]
160 pub answers: Option<PathBuf>,
161 #[arg(long = "key", value_name = "KEY")]
163 pub key: Option<String>,
164 #[arg(long = "tenant", short = 't', default_value = "demo")]
166 pub tenant: String,
167 #[arg(long = "team")]
169 pub team: Option<String>,
170 #[arg(long = "env", short = 'e', default_value = "dev")]
172 pub env: String,
173 #[arg(long = "domain", short = 'd', default_value = "all")]
175 pub domain: String,
176 #[arg(long = "parallel", default_value = "1")]
178 pub parallel: usize,
179 #[arg(long = "backup")]
181 pub backup: bool,
182 #[arg(long = "skip-secrets-init")]
184 pub skip_secrets_init: bool,
185 #[arg(long = "best-effort")]
187 pub best_effort: bool,
188 #[arg(skip)]
190 pub non_interactive: bool,
191 #[arg(long = "dry-run")]
193 pub dry_run: bool,
194 #[arg(long = "emit-answers")]
196 pub emit_answers: Option<PathBuf>,
197 #[arg(long = "advanced")]
199 pub advanced: bool,
200 #[arg(long = "port", value_name = "PORT")]
202 pub port: Option<u16>,
203}
204
205#[derive(Args, Debug, Clone)]
206pub struct BundleRemoveArgs {
207 #[arg(value_name = "PROVIDER_ID")]
209 pub provider_id: String,
210 #[arg(long = "bundle", short = 'b')]
212 pub bundle: Option<PathBuf>,
213 #[arg(long = "tenant", short = 't', default_value = "demo")]
215 pub tenant: String,
216 #[arg(long = "team")]
218 pub team: Option<String>,
219 #[arg(long = "force", short = 'f')]
221 pub force: bool,
222}
223
224#[derive(Args, Debug, Clone)]
225pub struct BundleBuildArgs {
226 #[arg(long = "bundle", short = 'b')]
228 pub bundle: Option<PathBuf>,
229 #[arg(long = "out", short = 'o')]
231 pub out: PathBuf,
232 #[arg(long = "tenant", short = 't')]
234 pub tenant: Option<String>,
235 #[arg(long = "team")]
237 pub team: Option<String>,
238 #[arg(long = "only-used-providers")]
240 pub only_used_providers: bool,
241 #[arg(long = "doctor")]
243 pub doctor: bool,
244 #[arg(long = "skip-doctor")]
246 pub skip_doctor: bool,
247}
248
249#[derive(Args, Debug, Clone)]
250pub struct BundleListArgs {
251 #[arg(long = "bundle", short = 'b')]
253 pub bundle: Option<PathBuf>,
254 #[arg(long = "domain", short = 'd', default_value = "messaging")]
256 pub domain: String,
257 #[arg(long = "pack", short = 'p')]
259 pub pack: Option<String>,
260 #[arg(long = "format", default_value = "text")]
262 pub format: String,
263}
264
265#[derive(Args, Debug, Clone)]
266pub struct BundleStatusArgs {
267 #[arg(long = "bundle", short = 'b')]
269 pub bundle: Option<PathBuf>,
270 #[arg(long = "format", default_value = "text")]
272 pub format: String,
273}