1 use std::{ffi::OsString, net::SocketAddr};
3 use clap::{crate_version, Parser, Subcommand, ValueEnum};
5 /// JSON-RPC client for signal-cli
6 #[derive(Parser, Debug)]
7 #[command(rename_all = "kebab-case", version = crate_version!())]
9 /// Account to use (for daemon in multi-account mode)
10 #[arg(short = 'a', long)]
11 pub account: Option<String>,
13 /// TCP host and port of signal-cli daemon
14 #[arg(long, conflicts_with = "json_rpc_http")]
15 pub json_rpc_tcp: Option<Option<SocketAddr>>,
17 /// UNIX socket address and port of signal-cli daemon
18 #[arg(long, conflicts_with = "json_rpc_tcp")]
19 pub json_rpc_socket: Option<Option<OsString>>,
21 /// HTTP URL of signal-cli daemon
22 #[arg(long, conflicts_with = "json_rpc_socket")]
23 pub json_rpc_http: Option<Option<String>>,
28 #[command(subcommand)]
29 pub command: CliCommands,
32 #[allow(clippy::large_enum_variant)]
33 #[derive(Subcommand, Debug)]
34 #[command(rename_all = "camelCase", version = crate_version!())]
35 pub enum CliCommands {
44 #[command(rename_all = "kebab-case")]
46 recipient: Vec<String>,
48 #[arg(short = 'g', long)]
49 group_id: Vec<String>,
51 DeleteLocalAccountData {
52 #[arg(long = "ignore-registered")]
53 ignore_registered: Option<bool>,
57 #[arg(short = 'v', long = "verification-code")]
58 verification_code: String,
60 #[arg(short = 'p', long)]
67 recipient: Option<String>,
68 #[arg(short = 'g', long = "group-id")]
69 group_id: Option<String>,
73 contact: Option<String>,
75 profile: Option<String>,
76 #[arg(short = 'g', long = "group-id")]
77 group_id: Option<String>,
80 #[arg(long = "pack-id")]
82 #[arg(long = "sticker-id")]
86 recipient: Vec<String>,
93 #[arg(short = 'n', long)]
98 recipient: Vec<String>,
99 #[arg(short = 'a', long = "all-recipients")]
100 all_recipients: bool,
102 blocked: Option<bool>,
104 name: Option<String>,
108 #[arg(short = 'd', long)]
110 #[arg(short = 'g', long = "group-id")]
111 group_id: Vec<String>,
114 #[arg(short = 'n', long)]
115 number: Option<String>,
119 #[arg(short = 'g', long = "group-id")]
127 #[arg(short = 't', long, default_value_t = 3.0)]
131 #[arg(short = 'v', long)]
134 captcha: Option<String>,
144 #[arg(short = 'd', long = "device-id")]
149 #[arg(short = 't', long = "target-timestamp")]
150 target_timestamp: u64,
152 recipient: Vec<String>,
154 #[arg(short = 'g', long = "group-id")]
155 group_id: Vec<String>,
157 #[arg(long = "note-to-self")]
160 #[command(rename_all = "kebab-case")]
162 recipient: Vec<String>,
164 #[arg(short = 'g', long)]
165 group_id: Vec<String>,
170 #[arg(short = 'e', long)]
173 #[arg(short = 'm', long)]
174 message: Option<String>,
176 #[arg(short = 'a', long)]
177 attachment: Vec<String>,
180 mention: Vec<String>,
183 text_style: Vec<String>,
186 quote_timestamp: Option<u64>,
189 quote_author: Option<String>,
192 quote_message: Option<String>,
195 quote_mention: Vec<String>,
198 quote_text_style: Vec<String>,
201 quote_attachment: Vec<String>,
204 preview_url: Option<String>,
207 preview_title: Option<String>,
210 preview_description: Option<String>,
213 preview_image: Option<String>,
216 sticker: Option<String>,
219 story_timestamp: Option<u64>,
222 story_author: Option<String>,
225 edit_timestamp: Option<u64>,
228 SendPaymentNotification {
238 recipient: Vec<String>,
240 #[arg(short = 'g', long = "group-id")]
241 group_id: Vec<String>,
243 #[arg(long = "note-to-self")]
246 #[arg(short = 'e', long)]
249 #[arg(short = 'a', long = "target-author")]
250 target_author: String,
252 #[arg(short = 't', long = "target-timestamp")]
253 target_timestamp: u64,
255 #[arg(short = 'r', long)]
264 #[arg(short = 't', long = "target-timestamp")]
265 target_timestamp: Vec<u64>,
267 #[arg(value_enum, long)]
272 recipient: Vec<String>,
274 #[arg(short = 'g', long = "group-id")]
275 group_id: Vec<String>,
277 #[arg(short = 's', long)]
285 #[arg(short = 'v', long)]
288 captcha: Option<String>,
290 SubmitRateLimitChallenge {
297 #[arg(short = 'a', long = "trust-all-known-keys")]
298 trust_all_known_keys: bool,
300 #[arg(short = 'v', long = "verified-safety-number")]
301 verified_safety_number: Option<String>,
303 #[command(rename_all = "kebab-case")]
305 recipient: Vec<String>,
307 #[arg(short = 'g', long)]
308 group_id: Vec<String>,
311 #[arg(long = "delete-account")]
312 delete_account: bool,
315 #[arg(short = 'n', long = "device-name")]
316 device_name: Option<String>,
317 #[arg(long = "unrestricted-unidentified-sender")]
318 unrestricted_unidentified_sender: Option<bool>,
319 #[arg(long = "discoverable-by-number")]
320 discoverable_by_number: Option<bool>,
321 #[arg(long = "number-sharing")]
322 number_sharing: Option<bool>,
324 UpdateConfiguration {
325 #[arg(long = "read-receipts")]
326 read_receipts: Option<bool>,
328 #[arg(long = "unidentified-delivery-indicators")]
329 unidentified_delivery_indicators: Option<bool>,
331 #[arg(long = "typing-indicators")]
332 typing_indicators: Option<bool>,
334 #[arg(long = "link-previews")]
335 link_previews: Option<bool>,
340 #[arg(short = 'e', long)]
341 expiration: Option<u32>,
343 #[arg(short = 'n', long)]
344 name: Option<String>,
347 #[arg(short = 'g', long = "group-id")]
348 group_id: Option<String>,
350 #[arg(short = 'n', long)]
351 name: Option<String>,
353 #[arg(short = 'd', long)]
354 description: Option<String>,
356 #[arg(short = 'a', long)]
357 avatar: Option<String>,
359 #[arg(short = 'm', long)]
362 #[arg(short = 'r', long = "remove-member")]
363 remove_member: Vec<String>,
368 #[arg(long = "remove-admin")]
369 remove_admin: Vec<String>,
377 #[arg(long = "reset-link")]
380 #[arg(value_enum, long)]
381 link: Option<LinkState>,
383 #[arg(value_enum, long = "set-permission-add-member")]
384 set_permission_add_member: Option<GroupPermission>,
386 #[arg(value_enum, long = "set-permission-edit-details")]
387 set_permission_edit_details: Option<GroupPermission>,
389 #[arg(value_enum, long = "set-permission-send-messages")]
390 set_permission_send_messages: Option<GroupPermission>,
392 #[arg(short = 'e', long)]
393 expiration: Option<u32>,
396 #[arg(long = "given-name")]
397 given_name: Option<String>,
399 #[arg(long = "family-name")]
400 family_name: Option<String>,
403 about: Option<String>,
405 #[arg(long = "about-emoji")]
406 about_emoji: Option<String>,
408 #[arg(long = "mobile-coin-address")]
409 mobile_coin_address: Option<String>,
412 avatar: Option<String>,
414 #[arg(long = "remove-avatar")]
421 verification_code: String,
423 #[arg(short = 'p', long)]
429 #[derive(ValueEnum, Clone, Debug)]
430 #[value(rename_all = "kebab-case")]
431 pub enum ReceiptType {
436 #[derive(ValueEnum, Clone, Debug)]
437 #[value(rename_all = "kebab-case")]
444 #[derive(ValueEnum, Clone, Debug)]
445 #[value(rename_all = "kebab-case")]
446 pub enum GroupPermission {