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 #[command(subcommand)]
84 pub command: Option<Command>,
85}
86
87#[derive(Subcommand, Debug)]
88pub enum Command {
89 #[command(subcommand)]
91 Bundle(BundleCommand),
92}
93
94#[derive(Subcommand, Debug, Clone)]
95pub enum BundleCommand {
96 Init(BundleInitArgs),
98 Add(BundleAddArgs),
100 Setup(BundleSetupArgs),
102 Update(BundleSetupArgs),
104 Remove(BundleRemoveArgs),
106 Build(BundleBuildArgs),
108 List(BundleListArgs),
110 Status(BundleStatusArgs),
112}
113
114#[derive(Args, Debug, Clone)]
115pub struct BundleInitArgs {
116 #[arg(value_name = "PATH")]
118 pub path: Option<PathBuf>,
119 #[arg(long = "name", short = 'n')]
121 pub name: Option<String>,
122}
123
124#[derive(Args, Debug, Clone)]
125pub struct BundleAddArgs {
126 #[arg(value_name = "PACK_REF")]
128 pub pack_ref: String,
129 #[arg(long = "bundle", short = 'b')]
131 pub bundle: Option<PathBuf>,
132 #[arg(long = "tenant", short = 't', default_value = "demo")]
134 pub tenant: String,
135 #[arg(long = "team")]
137 pub team: Option<String>,
138 #[arg(long = "env", short = 'e', default_value = "dev")]
140 pub env: String,
141 #[arg(long = "dry-run")]
143 pub dry_run: bool,
144}
145
146#[derive(Args, Debug, Clone)]
147pub struct BundleSetupArgs {
148 #[arg(value_name = "PROVIDER_ID")]
150 pub provider_id: Option<String>,
151 #[arg(long = "bundle", short = 'b')]
153 pub bundle: Option<PathBuf>,
154 #[arg(long = "answers", short = 'a')]
156 pub answers: Option<PathBuf>,
157 #[arg(long = "key", value_name = "KEY")]
159 pub key: Option<String>,
160 #[arg(long = "tenant", short = 't', default_value = "demo")]
162 pub tenant: String,
163 #[arg(long = "team")]
165 pub team: Option<String>,
166 #[arg(long = "env", short = 'e', default_value = "dev")]
168 pub env: String,
169 #[arg(long = "domain", short = 'd', default_value = "all")]
171 pub domain: String,
172 #[arg(long = "parallel", default_value = "1")]
174 pub parallel: usize,
175 #[arg(long = "backup")]
177 pub backup: bool,
178 #[arg(long = "skip-secrets-init")]
180 pub skip_secrets_init: bool,
181 #[arg(long = "best-effort")]
183 pub best_effort: bool,
184 #[arg(skip)]
186 pub non_interactive: bool,
187 #[arg(long = "dry-run")]
189 pub dry_run: bool,
190 #[arg(long = "emit-answers")]
192 pub emit_answers: Option<PathBuf>,
193 #[arg(long = "advanced")]
195 pub advanced: bool,
196}
197
198#[derive(Args, Debug, Clone)]
199pub struct BundleRemoveArgs {
200 #[arg(value_name = "PROVIDER_ID")]
202 pub provider_id: String,
203 #[arg(long = "bundle", short = 'b')]
205 pub bundle: Option<PathBuf>,
206 #[arg(long = "tenant", short = 't', default_value = "demo")]
208 pub tenant: String,
209 #[arg(long = "team")]
211 pub team: Option<String>,
212 #[arg(long = "force", short = 'f')]
214 pub force: bool,
215}
216
217#[derive(Args, Debug, Clone)]
218pub struct BundleBuildArgs {
219 #[arg(long = "bundle", short = 'b')]
221 pub bundle: Option<PathBuf>,
222 #[arg(long = "out", short = 'o')]
224 pub out: PathBuf,
225 #[arg(long = "tenant", short = 't')]
227 pub tenant: Option<String>,
228 #[arg(long = "team")]
230 pub team: Option<String>,
231 #[arg(long = "only-used-providers")]
233 pub only_used_providers: bool,
234 #[arg(long = "doctor")]
236 pub doctor: bool,
237 #[arg(long = "skip-doctor")]
239 pub skip_doctor: bool,
240}
241
242#[derive(Args, Debug, Clone)]
243pub struct BundleListArgs {
244 #[arg(long = "bundle", short = 'b')]
246 pub bundle: Option<PathBuf>,
247 #[arg(long = "domain", short = 'd', default_value = "messaging")]
249 pub domain: String,
250 #[arg(long = "pack", short = 'p')]
252 pub pack: Option<String>,
253 #[arg(long = "format", default_value = "text")]
255 pub format: String,
256}
257
258#[derive(Args, Debug, Clone)]
259pub struct BundleStatusArgs {
260 #[arg(long = "bundle", short = 'b')]
262 pub bundle: Option<PathBuf>,
263 #[arg(long = "format", default_value = "text")]
265 pub format: String,
266}