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 #[command(subcommand)]
71 pub command: Option<Command>,
72}
73
74#[derive(Subcommand, Debug)]
75pub enum Command {
76 #[command(subcommand)]
78 Bundle(BundleCommand),
79}
80
81#[derive(Subcommand, Debug, Clone)]
82pub enum BundleCommand {
83 Init(BundleInitArgs),
85 Add(BundleAddArgs),
87 Setup(BundleSetupArgs),
89 Update(BundleSetupArgs),
91 Remove(BundleRemoveArgs),
93 Build(BundleBuildArgs),
95 List(BundleListArgs),
97 Status(BundleStatusArgs),
99}
100
101#[derive(Args, Debug, Clone)]
102pub struct BundleInitArgs {
103 #[arg(value_name = "PATH")]
105 pub path: Option<PathBuf>,
106 #[arg(long = "name", short = 'n')]
108 pub name: Option<String>,
109}
110
111#[derive(Args, Debug, Clone)]
112pub struct BundleAddArgs {
113 #[arg(value_name = "PACK_REF")]
115 pub pack_ref: String,
116 #[arg(long = "bundle", short = 'b')]
118 pub bundle: Option<PathBuf>,
119 #[arg(long = "tenant", short = 't', default_value = "demo")]
121 pub tenant: String,
122 #[arg(long = "team")]
124 pub team: Option<String>,
125 #[arg(long = "env", short = 'e', default_value = "dev")]
127 pub env: String,
128 #[arg(long = "dry-run")]
130 pub dry_run: bool,
131}
132
133#[derive(Args, Debug, Clone)]
134pub struct BundleSetupArgs {
135 #[arg(value_name = "PROVIDER_ID")]
137 pub provider_id: Option<String>,
138 #[arg(long = "bundle", short = 'b')]
140 pub bundle: Option<PathBuf>,
141 #[arg(long = "answers", short = 'a')]
143 pub answers: Option<PathBuf>,
144 #[arg(long = "key", value_name = "KEY")]
146 pub key: Option<String>,
147 #[arg(long = "tenant", short = 't', default_value = "demo")]
149 pub tenant: String,
150 #[arg(long = "team")]
152 pub team: Option<String>,
153 #[arg(long = "env", short = 'e', default_value = "dev")]
155 pub env: String,
156 #[arg(long = "domain", short = 'd', default_value = "all")]
158 pub domain: String,
159 #[arg(long = "parallel", default_value = "1")]
161 pub parallel: usize,
162 #[arg(long = "backup")]
164 pub backup: bool,
165 #[arg(long = "skip-secrets-init")]
167 pub skip_secrets_init: bool,
168 #[arg(long = "best-effort")]
170 pub best_effort: bool,
171 #[arg(long = "non-interactive")]
173 pub non_interactive: bool,
174 #[arg(long = "dry-run")]
176 pub dry_run: bool,
177 #[arg(long = "emit-answers")]
179 pub emit_answers: Option<PathBuf>,
180 #[arg(long = "advanced")]
182 pub advanced: bool,
183}
184
185#[derive(Args, Debug, Clone)]
186pub struct BundleRemoveArgs {
187 #[arg(value_name = "PROVIDER_ID")]
189 pub provider_id: String,
190 #[arg(long = "bundle", short = 'b')]
192 pub bundle: Option<PathBuf>,
193 #[arg(long = "tenant", short = 't', default_value = "demo")]
195 pub tenant: String,
196 #[arg(long = "team")]
198 pub team: Option<String>,
199 #[arg(long = "force", short = 'f')]
201 pub force: bool,
202}
203
204#[derive(Args, Debug, Clone)]
205pub struct BundleBuildArgs {
206 #[arg(long = "bundle", short = 'b')]
208 pub bundle: Option<PathBuf>,
209 #[arg(long = "out", short = 'o')]
211 pub out: PathBuf,
212 #[arg(long = "tenant", short = 't')]
214 pub tenant: Option<String>,
215 #[arg(long = "team")]
217 pub team: Option<String>,
218 #[arg(long = "only-used-providers")]
220 pub only_used_providers: bool,
221 #[arg(long = "doctor")]
223 pub doctor: bool,
224 #[arg(long = "skip-doctor")]
226 pub skip_doctor: bool,
227}
228
229#[derive(Args, Debug, Clone)]
230pub struct BundleListArgs {
231 #[arg(long = "bundle", short = 'b')]
233 pub bundle: Option<PathBuf>,
234 #[arg(long = "domain", short = 'd', default_value = "messaging")]
236 pub domain: String,
237 #[arg(long = "pack", short = 'p')]
239 pub pack: Option<String>,
240 #[arg(long = "format", default_value = "text")]
242 pub format: String,
243}
244
245#[derive(Args, Debug, Clone)]
246pub struct BundleStatusArgs {
247 #[arg(long = "bundle", short = 'b')]
249 pub bundle: Option<PathBuf>,
250 #[arg(long = "format", default_value = "text")]
252 pub format: String,
253}