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 #[command(subcommand)]
80 pub command: Option<Command>,
81}
82
83#[derive(Subcommand, Debug)]
84pub enum Command {
85 #[command(subcommand)]
87 Bundle(BundleCommand),
88}
89
90#[derive(Subcommand, Debug, Clone)]
91pub enum BundleCommand {
92 Init(BundleInitArgs),
94 Add(BundleAddArgs),
96 Setup(BundleSetupArgs),
98 Update(BundleSetupArgs),
100 Remove(BundleRemoveArgs),
102 Build(BundleBuildArgs),
104 List(BundleListArgs),
106 Status(BundleStatusArgs),
108}
109
110#[derive(Args, Debug, Clone)]
111pub struct BundleInitArgs {
112 #[arg(value_name = "PATH")]
114 pub path: Option<PathBuf>,
115 #[arg(long = "name", short = 'n')]
117 pub name: Option<String>,
118}
119
120#[derive(Args, Debug, Clone)]
121pub struct BundleAddArgs {
122 #[arg(value_name = "PACK_REF")]
124 pub pack_ref: String,
125 #[arg(long = "bundle", short = 'b')]
127 pub bundle: Option<PathBuf>,
128 #[arg(long = "tenant", short = 't', default_value = "demo")]
130 pub tenant: String,
131 #[arg(long = "team")]
133 pub team: Option<String>,
134 #[arg(long = "env", short = 'e', default_value = "dev")]
136 pub env: String,
137 #[arg(long = "dry-run")]
139 pub dry_run: bool,
140}
141
142#[derive(Args, Debug, Clone)]
143pub struct BundleSetupArgs {
144 #[arg(value_name = "PROVIDER_ID")]
146 pub provider_id: Option<String>,
147 #[arg(long = "bundle", short = 'b')]
149 pub bundle: Option<PathBuf>,
150 #[arg(long = "answers", short = 'a')]
152 pub answers: Option<PathBuf>,
153 #[arg(long = "key", value_name = "KEY")]
155 pub key: Option<String>,
156 #[arg(long = "tenant", short = 't', default_value = "demo")]
158 pub tenant: String,
159 #[arg(long = "team")]
161 pub team: Option<String>,
162 #[arg(long = "env", short = 'e', default_value = "dev")]
164 pub env: String,
165 #[arg(long = "domain", short = 'd', default_value = "all")]
167 pub domain: String,
168 #[arg(long = "parallel", default_value = "1")]
170 pub parallel: usize,
171 #[arg(long = "backup")]
173 pub backup: bool,
174 #[arg(long = "skip-secrets-init")]
176 pub skip_secrets_init: bool,
177 #[arg(long = "best-effort")]
179 pub best_effort: bool,
180 #[arg(long = "non-interactive")]
182 pub non_interactive: bool,
183 #[arg(long = "dry-run")]
185 pub dry_run: bool,
186 #[arg(long = "emit-answers")]
188 pub emit_answers: Option<PathBuf>,
189 #[arg(long = "advanced")]
191 pub advanced: bool,
192}
193
194#[derive(Args, Debug, Clone)]
195pub struct BundleRemoveArgs {
196 #[arg(value_name = "PROVIDER_ID")]
198 pub provider_id: String,
199 #[arg(long = "bundle", short = 'b')]
201 pub bundle: Option<PathBuf>,
202 #[arg(long = "tenant", short = 't', default_value = "demo")]
204 pub tenant: String,
205 #[arg(long = "team")]
207 pub team: Option<String>,
208 #[arg(long = "force", short = 'f')]
210 pub force: bool,
211}
212
213#[derive(Args, Debug, Clone)]
214pub struct BundleBuildArgs {
215 #[arg(long = "bundle", short = 'b')]
217 pub bundle: Option<PathBuf>,
218 #[arg(long = "out", short = 'o')]
220 pub out: PathBuf,
221 #[arg(long = "tenant", short = 't')]
223 pub tenant: Option<String>,
224 #[arg(long = "team")]
226 pub team: Option<String>,
227 #[arg(long = "only-used-providers")]
229 pub only_used_providers: bool,
230 #[arg(long = "doctor")]
232 pub doctor: bool,
233 #[arg(long = "skip-doctor")]
235 pub skip_doctor: bool,
236}
237
238#[derive(Args, Debug, Clone)]
239pub struct BundleListArgs {
240 #[arg(long = "bundle", short = 'b')]
242 pub bundle: Option<PathBuf>,
243 #[arg(long = "domain", short = 'd', default_value = "messaging")]
245 pub domain: String,
246 #[arg(long = "pack", short = 'p')]
248 pub pack: Option<String>,
249 #[arg(long = "format", default_value = "text")]
251 pub format: String,
252}
253
254#[derive(Args, Debug, Clone)]
255pub struct BundleStatusArgs {
256 #[arg(long = "bundle", short = 'b')]
258 pub bundle: Option<PathBuf>,
259 #[arg(long = "format", default_value = "text")]
261 pub format: String,
262}