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
19 #[arg(long, conflicts_with = "json_rpc_tcp")]
20 pub json_rpc_socket: Option<Option<OsString>>,
22 /// HTTP URL of signal-cli daemon
23 #[arg(long, conflicts_with = "json_rpc_socket")]
24 pub json_rpc_http: Option<Option<String>>,
29 #[command(subcommand)]
30 pub command: CliCommands,
33 #[allow(clippy::large_enum_variant)]
34 #[derive(Subcommand, Debug)]
35 #[command(rename_all = "camelCase", version = crate_version!())]
36 pub enum CliCommands {
45 #[command(rename_all = "kebab-case")]
47 recipient: Vec<String>,
49 #[arg(short = 'g', long)]
50 group_id: Vec<String>,
52 DeleteLocalAccountData {
53 #[arg(long = "ignore-registered")]
54 ignore_registered: Option<bool>,
58 #[arg(short = 'v', long = "verification-code")]
59 verification_code: String,
61 #[arg(short = 'p', long)]
68 recipient: Option<String>,
69 #[arg(short = 'g', long = "group-id")]
70 group_id: Option<String>,
74 contact: Option<String>,
76 profile: Option<String>,
77 #[arg(short = 'g', long = "group-id")]
78 group_id: Option<String>,
81 #[arg(long = "pack-id")]
83 #[arg(long = "sticker-id")]
87 recipient: Vec<String>,
89 username: Vec<String>,
96 #[arg(short = 'n', long)]
101 recipient: Vec<String>,
102 #[arg(short = 'a', long = "all-recipients")]
103 all_recipients: bool,
105 blocked: Option<bool>,
107 name: Option<String>,
111 #[arg(short = 'd', long)]
113 #[arg(short = 'g', long = "group-id")]
114 group_id: Vec<String>,
117 #[arg(short = 'n', long)]
118 number: Option<String>,
122 #[arg(short = 'g', long = "group-id")]
130 #[arg(short = 't', long, default_value_t = 3.0)]
134 #[arg(short = 'v', long)]
137 captcha: Option<String>,
147 #[arg(short = 'd', long = "device-id")]
152 #[arg(short = 't', long = "target-timestamp")]
153 target_timestamp: u64,
155 recipient: Vec<String>,
157 #[arg(short = 'g', long = "group-id")]
158 group_id: Vec<String>,
160 #[arg(long = "note-to-self")]
163 #[command(rename_all = "kebab-case")]
165 recipient: Vec<String>,
167 #[arg(short = 'g', long)]
168 group_id: Vec<String>,
173 #[arg(short = 'e', long)]
176 #[arg(short = 'm', long)]
177 message: Option<String>,
179 #[arg(short = 'a', long)]
180 attachment: Vec<String>,
186 mention: Vec<String>,
189 text_style: Vec<String>,
192 quote_timestamp: Option<u64>,
195 quote_author: Option<String>,
198 quote_message: Option<String>,
201 quote_mention: Vec<String>,
204 quote_text_style: Vec<String>,
207 quote_attachment: Vec<String>,
210 preview_url: Option<String>,
213 preview_title: Option<String>,
216 preview_description: Option<String>,
219 preview_image: Option<String>,
222 sticker: Option<String>,
225 story_timestamp: Option<u64>,
228 story_author: Option<String>,
231 edit_timestamp: Option<u64>,
234 SendPaymentNotification {
244 recipient: Vec<String>,
246 #[arg(short = 'g', long = "group-id")]
247 group_id: Vec<String>,
249 #[arg(long = "note-to-self")]
252 #[arg(short = 'e', long)]
255 #[arg(short = 'a', long = "target-author")]
256 target_author: String,
258 #[arg(short = 't', long = "target-timestamp")]
259 target_timestamp: u64,
261 #[arg(short = 'r', long)]
270 #[arg(short = 't', long = "target-timestamp")]
271 target_timestamp: Vec<u64>,
273 #[arg(value_enum, long)]
278 recipient: Vec<String>,
280 #[arg(short = 'g', long = "group-id")]
281 group_id: Vec<String>,
283 #[arg(short = 's', long)]
286 SendMessageRequestResponse {
287 recipient: Vec<String>,
289 #[arg(short = 'g', long = "group-id")]
290 group_id: Vec<String>,
292 r#type: MessageRequestResponseType,
299 #[arg(short = 'v', long)]
302 captcha: Option<String>,
304 SubmitRateLimitChallenge {
311 #[arg(short = 'a', long = "trust-all-known-keys")]
312 trust_all_known_keys: bool,
314 #[arg(short = 'v', long = "verified-safety-number")]
315 verified_safety_number: Option<String>,
317 #[command(rename_all = "kebab-case")]
319 recipient: Vec<String>,
321 #[arg(short = 'g', long)]
322 group_id: Vec<String>,
325 #[arg(long = "delete-account")]
326 delete_account: bool,
329 #[arg(short = 'n', long = "device-name")]
330 device_name: Option<String>,
331 #[arg(long = "unrestricted-unidentified-sender")]
332 unrestricted_unidentified_sender: Option<bool>,
333 #[arg(long = "discoverable-by-number")]
334 discoverable_by_number: Option<bool>,
335 #[arg(long = "number-sharing")]
336 number_sharing: Option<bool>,
338 UpdateConfiguration {
339 #[arg(long = "read-receipts")]
340 read_receipts: Option<bool>,
342 #[arg(long = "unidentified-delivery-indicators")]
343 unidentified_delivery_indicators: Option<bool>,
345 #[arg(long = "typing-indicators")]
346 typing_indicators: Option<bool>,
348 #[arg(long = "link-previews")]
349 link_previews: Option<bool>,
354 #[arg(short = 'e', long)]
355 expiration: Option<u32>,
357 #[arg(short = 'n', long)]
358 name: Option<String>,
361 #[arg(short = 'g', long = "group-id")]
362 group_id: Option<String>,
364 #[arg(short = 'n', long)]
365 name: Option<String>,
367 #[arg(short = 'd', long)]
368 description: Option<String>,
370 #[arg(short = 'a', long)]
371 avatar: Option<String>,
373 #[arg(short = 'm', long)]
376 #[arg(short = 'r', long = "remove-member")]
377 remove_member: Vec<String>,
382 #[arg(long = "remove-admin")]
383 remove_admin: Vec<String>,
391 #[arg(long = "reset-link")]
394 #[arg(value_enum, long)]
395 link: Option<LinkState>,
397 #[arg(value_enum, long = "set-permission-add-member")]
398 set_permission_add_member: Option<GroupPermission>,
400 #[arg(value_enum, long = "set-permission-edit-details")]
401 set_permission_edit_details: Option<GroupPermission>,
403 #[arg(value_enum, long = "set-permission-send-messages")]
404 set_permission_send_messages: Option<GroupPermission>,
406 #[arg(short = 'e', long)]
407 expiration: Option<u32>,
410 #[arg(long = "given-name")]
411 given_name: Option<String>,
413 #[arg(long = "family-name")]
414 family_name: Option<String>,
417 about: Option<String>,
419 #[arg(long = "about-emoji")]
420 about_emoji: Option<String>,
422 #[arg(long = "mobile-coin-address", visible_alias = "mobilecoin-address")]
423 mobile_coin_address: Option<String>,
426 avatar: Option<String>,
428 #[arg(long = "remove-avatar")]
435 verification_code: String,
437 #[arg(short = 'p', long)]
443 #[derive(ValueEnum, Clone, Debug)]
444 #[value(rename_all = "kebab-case")]
445 pub enum ReceiptType {
450 #[derive(ValueEnum, Clone, Debug)]
451 #[value(rename_all = "kebab-case")]
458 #[derive(ValueEnum, Clone, Debug)]
459 #[value(rename_all = "kebab-case")]
460 pub enum GroupPermission {
465 #[derive(ValueEnum, Clone, Debug)]
466 #[value(rename_all = "kebab-case")]
467 pub enum MessageRequestResponseType {