1#![forbid(unsafe_code)]
4use super::parse_cli_char_limit;
7use clap::{ArgAction, Subcommand, ValueHint};
8use std::path::PathBuf;
9
10#[derive(Debug, Subcommand)]
12pub enum VpsAction {
13 Add {
15 #[arg(long)]
17 name: String,
18 #[arg(long)]
20 host: String,
21 #[arg(
23 long,
24 default_value_t = crate::constants::DEFAULT_SSH_PORT,
25 value_parser = clap::value_parser!(u16).range(1..=65535)
26 )]
27 port: u16,
28 #[arg(long)]
30 user: String,
31 #[arg(long, conflicts_with = "password_stdin")]
33 password: Option<String>,
34 #[arg(long)]
36 password_stdin: bool,
37 #[arg(long, value_name = "PATH", value_hint = ValueHint::FilePath)]
39 key: Option<PathBuf>,
40 #[arg(long)]
42 key_passphrase: Option<String>,
43 #[arg(long, action = ArgAction::SetTrue, conflicts_with_all = ["password", "password_stdin", "key"])]
45 use_agent: bool,
46 #[arg(long, value_name = "PATH", value_hint = ValueHint::AnyPath)]
48 agent_socket: Option<PathBuf>,
49 #[arg(long, default_value_t = crate::vps::model::DEFAULT_TIMEOUT_MS, value_name = "MS")]
51 timeout: u64,
52 #[arg(long, value_name = "N", value_parser = parse_cli_char_limit)]
54 max_command_chars: Option<usize>,
55 #[arg(long, value_name = "N", value_parser = parse_cli_char_limit)]
57 max_output_chars: Option<usize>,
58 #[arg(long, alias = "maxChars", value_name = "N", value_parser = parse_cli_char_limit)]
60 max_chars: Option<usize>,
61 #[arg(
63 long,
64 alias = "sudoPassword",
65 alias = "sudo_password",
66 conflicts_with = "sudo_password_stdin"
67 )]
68 sudo_password: Option<String>,
69 #[arg(long)]
71 sudo_password_stdin: bool,
72 #[arg(
74 long,
75 alias = "suPassword",
76 alias = "su_password",
77 conflicts_with = "su_password_stdin"
78 )]
79 su_password: Option<String>,
80 #[arg(long)]
82 su_password_stdin: bool,
83 #[arg(long, default_value_t = false)]
85 disable_sudo: bool,
86 #[arg(long = "tag", value_name = "TAG", action = ArgAction::Append)]
88 tags: Vec<String>,
89 #[arg(long, action = ArgAction::SetTrue)]
91 tls: bool,
92 #[arg(long, value_name = "NAME")]
94 tls_sni: Option<String>,
95 #[arg(long, value_name = "PATH", value_hint = ValueHint::FilePath)]
97 tls_client_cert: Option<PathBuf>,
98 #[arg(long, value_name = "PATH", value_hint = ValueHint::FilePath)]
100 tls_client_key: Option<PathBuf>,
101 #[arg(long)]
103 check: bool,
104 },
105
106 List {
108 #[arg(from_global)]
110 json: bool,
111 #[arg(long = "tag", value_name = "TAG", action = ArgAction::Append)]
113 tags: Vec<String>,
114 },
115
116 Remove {
118 name: String,
120 },
121
122 Edit {
124 name: String,
126 #[arg(long)]
128 host: Option<String>,
129 #[arg(long, value_parser = clap::value_parser!(u16).range(1..=65535))]
131 port: Option<u16>,
132 #[arg(long)]
134 user: Option<String>,
135 #[arg(long, conflicts_with = "password_stdin")]
137 password: Option<String>,
138 #[arg(long)]
140 password_stdin: bool,
141 #[arg(long, value_name = "PATH", value_hint = ValueHint::FilePath)]
143 key: Option<PathBuf>,
144 #[arg(long)]
146 key_passphrase: Option<String>,
147 #[arg(long, action = ArgAction::SetTrue, conflicts_with_all = ["password", "password_stdin", "key"])]
149 use_agent: bool,
150 #[arg(long, value_name = "PATH", value_hint = ValueHint::AnyPath)]
152 agent_socket: Option<PathBuf>,
153 #[arg(long, value_name = "MS")]
155 timeout: Option<u64>,
156 #[arg(long, value_name = "N", value_parser = parse_cli_char_limit)]
158 max_command_chars: Option<usize>,
159 #[arg(long, value_name = "N", value_parser = parse_cli_char_limit)]
161 max_output_chars: Option<usize>,
162 #[arg(long, alias = "maxChars", value_name = "N", value_parser = parse_cli_char_limit)]
164 max_chars: Option<usize>,
165 #[arg(
167 long,
168 alias = "sudoPassword",
169 alias = "sudo_password",
170 conflicts_with = "sudo_password_stdin"
171 )]
172 sudo_password: Option<String>,
173 #[arg(long, action = ArgAction::SetTrue)]
175 sudo_password_stdin: bool,
176 #[arg(
178 long,
179 alias = "suPassword",
180 alias = "su_password",
181 conflicts_with = "su_password_stdin"
182 )]
183 su_password: Option<String>,
184 #[arg(long, action = ArgAction::SetTrue)]
186 su_password_stdin: bool,
187 #[arg(long, action = ArgAction::SetTrue, conflicts_with = "enable_sudo")]
189 disable_sudo: bool,
190 #[arg(long, action = ArgAction::SetTrue, conflicts_with = "disable_sudo")]
192 enable_sudo: bool,
193 #[arg(long, action = ArgAction::SetTrue, conflicts_with = "no_tls")]
195 tls: bool,
196 #[arg(long, action = ArgAction::SetTrue, conflicts_with = "tls")]
198 no_tls: bool,
199 #[arg(long, value_name = "NAME")]
201 tls_sni: Option<String>,
202 #[arg(long, value_name = "PATH", value_hint = ValueHint::FilePath)]
204 tls_client_cert: Option<PathBuf>,
205 #[arg(long, value_name = "PATH", value_hint = ValueHint::FilePath)]
207 tls_client_key: Option<PathBuf>,
208 },
209
210 Show {
212 name: String,
214 #[arg(from_global)]
216 json: bool,
217 },
218
219 Path,
221
222 Doctor {
224 #[arg(from_global)]
226 json: bool,
227 #[arg(long, action = ArgAction::SetTrue)]
230 probe_ssh: bool,
231 #[arg(long, value_name = "LIST")]
233 hosts: Option<String>,
234 },
235
236 Export {
238 #[arg(long)]
240 include_secrets: bool,
241 #[arg(long, short, value_name = "PATH", value_hint = ValueHint::FilePath)]
243 output: Option<PathBuf>,
244 #[arg(from_global)]
247 json: bool,
248 #[arg(long)]
250 i_understand_secrets_on_stdout: bool,
251 },
252
253 Import {
255 #[arg(long, value_name = "PATH", value_hint = ValueHint::FilePath)]
257 file: PathBuf,
258 #[arg(long)]
260 allow_incomplete: bool,
261 },
262}