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>,
183 mention: Vec<String>,
186 text_style: Vec<String>,
189 quote_timestamp: Option<u64>,
192 quote_author: Option<String>,
195 quote_message: Option<String>,
198 quote_mention: Vec<String>,
201 quote_text_style: Vec<String>,
204 quote_attachment: Vec<String>,
207 preview_url: Option<String>,
210 preview_title: Option<String>,
213 preview_description: Option<String>,
216 preview_image: Option<String>,
219 sticker: Option<String>,
222 story_timestamp: Option<u64>,
225 story_author: Option<String>,
228 edit_timestamp: Option<u64>,
231 SendPaymentNotification {
241 recipient: Vec<String>,
243 #[arg(short = 'g', long = "group-id")]
244 group_id: Vec<String>,
246 #[arg(long = "note-to-self")]
249 #[arg(short = 'e', long)]
252 #[arg(short = 'a', long = "target-author")]
253 target_author: String,
255 #[arg(short = 't', long = "target-timestamp")]
256 target_timestamp: u64,
258 #[arg(short = 'r', long)]
267 #[arg(short = 't', long = "target-timestamp")]
268 target_timestamp: Vec<u64>,
270 #[arg(value_enum, long)]
275 recipient: Vec<String>,
277 #[arg(short = 'g', long = "group-id")]
278 group_id: Vec<String>,
280 #[arg(short = 's', long)]
283 SendMessageRequestResponse {
284 recipient: Vec<String>,
286 #[arg(short = 'g', long = "group-id")]
287 group_id: Vec<String>,
289 r#type: MessageRequestResponseType,
296 #[arg(short = 'v', long)]
299 captcha: Option<String>,
301 SubmitRateLimitChallenge {
308 #[arg(short = 'a', long = "trust-all-known-keys")]
309 trust_all_known_keys: bool,
311 #[arg(short = 'v', long = "verified-safety-number")]
312 verified_safety_number: Option<String>,
314 #[command(rename_all = "kebab-case")]
316 recipient: Vec<String>,
318 #[arg(short = 'g', long)]
319 group_id: Vec<String>,
322 #[arg(long = "delete-account")]
323 delete_account: bool,
326 #[arg(short = 'n', long = "device-name")]
327 device_name: Option<String>,
328 #[arg(long = "unrestricted-unidentified-sender")]
329 unrestricted_unidentified_sender: Option<bool>,
330 #[arg(long = "discoverable-by-number")]
331 discoverable_by_number: Option<bool>,
332 #[arg(long = "number-sharing")]
333 number_sharing: Option<bool>,
335 UpdateConfiguration {
336 #[arg(long = "read-receipts")]
337 read_receipts: Option<bool>,
339 #[arg(long = "unidentified-delivery-indicators")]
340 unidentified_delivery_indicators: Option<bool>,
342 #[arg(long = "typing-indicators")]
343 typing_indicators: Option<bool>,
345 #[arg(long = "link-previews")]
346 link_previews: Option<bool>,
351 #[arg(short = 'e', long)]
352 expiration: Option<u32>,
354 #[arg(short = 'n', long)]
355 name: Option<String>,
358 #[arg(short = 'g', long = "group-id")]
359 group_id: Option<String>,
361 #[arg(short = 'n', long)]
362 name: Option<String>,
364 #[arg(short = 'd', long)]
365 description: Option<String>,
367 #[arg(short = 'a', long)]
368 avatar: Option<String>,
370 #[arg(short = 'm', long)]
373 #[arg(short = 'r', long = "remove-member")]
374 remove_member: Vec<String>,
379 #[arg(long = "remove-admin")]
380 remove_admin: Vec<String>,
388 #[arg(long = "reset-link")]
391 #[arg(value_enum, long)]
392 link: Option<LinkState>,
394 #[arg(value_enum, long = "set-permission-add-member")]
395 set_permission_add_member: Option<GroupPermission>,
397 #[arg(value_enum, long = "set-permission-edit-details")]
398 set_permission_edit_details: Option<GroupPermission>,
400 #[arg(value_enum, long = "set-permission-send-messages")]
401 set_permission_send_messages: Option<GroupPermission>,
403 #[arg(short = 'e', long)]
404 expiration: Option<u32>,
407 #[arg(long = "given-name")]
408 given_name: Option<String>,
410 #[arg(long = "family-name")]
411 family_name: Option<String>,
414 about: Option<String>,
416 #[arg(long = "about-emoji")]
417 about_emoji: Option<String>,
419 #[arg(long = "mobile-coin-address", visible_alias = "mobilecoin-address")]
420 mobile_coin_address: Option<String>,
423 avatar: Option<String>,
425 #[arg(long = "remove-avatar")]
432 verification_code: String,
434 #[arg(short = 'p', long)]
440 #[derive(ValueEnum, Clone, Debug)]
441 #[value(rename_all = "kebab-case")]
442 pub enum ReceiptType {
447 #[derive(ValueEnum, Clone, Debug)]
448 #[value(rename_all = "kebab-case")]
455 #[derive(ValueEnum, Clone, Debug)]
456 #[value(rename_all = "kebab-case")]
457 pub enum GroupPermission {
462 #[derive(ValueEnum, Clone, Debug)]
463 #[value(rename_all = "kebab-case")]
464 pub enum MessageRequestResponseType {