1use clap::{Args, Subcommand};
2use std::{ffi::OsString, path::PathBuf};
3
4#[derive(Subcommand, Debug)]
5pub enum EnvCommands {
6 List {
8 #[arg(long)]
10 reveal: bool,
11 },
12 Set {
14 key: String,
16 value: String,
18 #[arg(long)]
21 force: bool,
22 },
23 Delete {
25 key: String,
27 #[arg(long)]
30 force: bool,
31 },
32 Get {
34 key: String,
36 },
37 Run(EnvRunCommand),
39 Workspace(EnvWorkspaceCommand),
41 Proxy(EnvProxyCommand),
43 Broker(EnvBrokerCommand),
45 Secret(EnvSecretCommand),
47}
48
49#[derive(Args, Debug)]
50pub struct EnvWorkspaceCommand {
51 #[command(subcommand)]
52 pub command: EnvWorkspaceSubcommand,
53}
54
55#[derive(Subcommand, Debug)]
56pub enum EnvWorkspaceSubcommand {
57 Init(EnvWorkspaceInitCommand),
59}
60
61#[derive(Args, Debug)]
62pub struct EnvWorkspaceInitCommand {
63 #[arg(long)]
65 pub from_dotenv: bool,
66 #[arg(long, value_name = "MODE")]
68 pub mode: Vec<String>,
69 #[arg(long, value_name = "KEY")]
71 pub secret: Vec<String>,
72 #[arg(long)]
74 pub force: bool,
75 #[arg(long)]
77 pub dry_run: bool,
78}
79
80#[derive(Args, Debug)]
81pub struct EnvProxyCommand {
82 #[command(subcommand)]
83 pub command: EnvProxySubcommand,
84}
85
86#[derive(Args, Debug)]
87pub struct EnvBrokerCommand {
88 #[command(subcommand)]
89 pub command: EnvBrokerSubcommand,
90}
91
92#[derive(Subcommand, Debug)]
93pub enum EnvBrokerSubcommand {
94 Describe {
96 #[arg(long, value_name = "FILE")]
97 workspace: Option<PathBuf>,
98 #[arg(long)]
99 mode: String,
100 #[arg(
101 long,
102 value_name = "KEY",
103 required_unless_present = "release_all_declared",
104 conflicts_with = "release_all_declared"
105 )]
106 release: Vec<String>,
107 #[arg(long)]
109 release_all_declared: bool,
110 #[arg(required = true, trailing_var_arg = true, allow_hyphen_values = true)]
111 command: Vec<String>,
112 },
113 Policy(EnvBrokerPolicyCommand),
115}
116
117#[derive(Args, Debug)]
118pub struct EnvBrokerPolicyCommand {
119 #[command(subcommand)]
120 pub command: EnvBrokerPolicySubcommand,
121}
122
123#[derive(Args, Debug)]
124pub struct EnvBrokerPolicyInput {
125 #[arg(long)]
126 pub name: String,
127 #[arg(long)]
128 pub ssh_target: String,
129 #[arg(long, default_value = "")]
130 pub project: String,
131 #[arg(long, value_name = "FILE")]
132 pub workspace: PathBuf,
133 #[arg(long, value_name = "REMOTE_FILE")]
135 pub remote_workspace: Option<String>,
136 #[arg(long)]
137 pub mode: String,
138 #[arg(
139 long,
140 value_name = "KEY",
141 required_unless_present = "release_all_declared",
142 conflicts_with = "release_all_declared"
143 )]
144 pub release: Vec<String>,
145 #[arg(long)]
147 pub release_all_declared: bool,
148 #[arg(required = true, trailing_var_arg = true, allow_hyphen_values = true)]
149 pub command: Vec<String>,
150}
151
152#[derive(Subcommand, Debug)]
153pub enum EnvBrokerPolicySubcommand {
154 Add(EnvBrokerPolicyInput),
156 Update(EnvBrokerPolicyInput),
158 Diff {
160 name: String,
161 #[arg(long, value_name = "FILE")]
162 workspace: PathBuf,
163 #[arg(long)]
164 mode: String,
165 #[arg(
166 long,
167 value_name = "KEY",
168 required_unless_present = "release_all_declared",
169 conflicts_with = "release_all_declared"
170 )]
171 release: Vec<String>,
172 #[arg(long)]
174 release_all_declared: bool,
175 #[arg(required = true, trailing_var_arg = true, allow_hyphen_values = true)]
176 command: Vec<String>,
177 },
178 List,
180 Info { name: String },
182 Remove { name: String },
184}
185
186#[derive(Subcommand, Debug)]
187pub enum EnvProxySubcommand {
188 Install {
190 #[arg(value_name = "COMMAND")]
191 command: String,
192 #[arg(long = "with", value_name = "KEY[=ALIAS]", required = true)]
193 with: Vec<String>,
194 #[arg(long)]
196 project: bool,
197 },
198 List,
200 Uninstall {
202 #[arg(value_name = "COMMAND")]
203 command: String,
204 },
205 Enable {
207 #[arg(value_name = "COMMAND")]
208 command: String,
209 #[arg(long)]
211 project: bool,
212 },
213 Disable {
215 #[arg(value_name = "COMMAND")]
216 command: String,
217 #[arg(long)]
219 project: bool,
220 },
221 #[command(hide = true)]
222 Exec {
223 #[arg(long)]
224 target: PathBuf,
225 #[arg(value_name = "COMMAND")]
226 command: String,
227 #[arg(trailing_var_arg = true, allow_hyphen_values = true)]
228 args: Vec<OsString>,
229 },
230}
231
232#[derive(Args, Debug)]
233pub struct EnvSecretCommand {
234 #[command(subcommand)]
235 pub command: EnvSecretSubcommand,
236}
237
238#[derive(Subcommand, Debug)]
239pub enum EnvSecretSubcommand {
240 Decrypt {
242 key: String,
244 },
245 Export {
247 key: String,
249 #[arg(long = "as", value_name = "ALIAS")]
251 alias: Option<String>,
252 },
253 Encrypt(EnvEncryptCommand),
255 Seal(EnvSealCommand),
257 Identity(EnvIdentityCommand),
259}
260
261#[derive(Args, Debug)]
262pub struct EnvEncryptCommand {
263 #[arg(long)]
265 pub backend: Option<String>,
266 #[arg(short = 'r', long = "recipient")]
268 pub recipients: Vec<String>,
269 #[arg(long)]
271 pub set: Option<String>,
272 #[arg(long)]
274 pub from: Option<String>,
275 #[arg(long)]
278 pub force: bool,
279}
280
281#[derive(Args, Debug)]
282pub struct EnvSealCommand {
283 #[arg(value_name = "FILE")]
285 pub file: Option<PathBuf>,
286 #[arg(long, value_name = "FILE")]
288 pub workspace: Option<PathBuf>,
289 #[arg(long)]
291 pub backend: Option<String>,
292 #[arg(short = 'r', long = "recipient")]
294 pub recipients: Vec<String>,
295}
296
297#[derive(Args, Debug)]
298pub struct EnvIdentityCommand {
299 #[command(subcommand)]
300 pub command: EnvIdentitySubcommand,
301}
302
303#[derive(Subcommand, Debug)]
304pub enum EnvIdentitySubcommand {
305 Init {
307 #[arg(long)]
309 touch_id: bool,
310 #[arg(long, value_name = "POLICY")]
313 access_control: Option<String>,
314 #[arg(short = 'o', long, value_name = "PATH")]
316 output: Option<PathBuf>,
317 #[arg(long)]
319 force: bool,
320 },
321 List,
323}
324
325#[derive(Args, Debug)]
326pub struct EnvRunCommand {
327 #[arg(long, value_name = "FILE")]
329 pub workspace: Option<PathBuf>,
330 #[arg(long)]
332 pub mode: Option<String>,
333 #[arg(long, conflicts_with_all = ["workspace", "mode"])]
335 pub no_workspace: bool,
336 #[arg(long = "with", value_name = "KEY[=ALIAS]")]
338 pub with: Vec<String>,
339 #[arg(long)]
341 pub secret_broker: bool,
342 #[arg(
344 long = "secret",
345 value_name = "KEY[=ALIAS]",
346 requires = "secret_broker",
347 requires = "no_workspace"
348 )]
349 pub secret: Vec<String>,
350 #[arg(required = true, trailing_var_arg = true, allow_hyphen_values = true)]
352 pub command: Vec<OsString>,
353}