1 use clap::{crate_version, Parser, Subcommand, ValueEnum};
2 use std::{ffi::OsString, net::SocketAddr};
4 /// JSON-RPC client for signal-cli
5 #[derive(Parser, Debug)]
6 #[command(rename_all = "kebab-case", version=crate_version!())]
8 /// Account to use (for daemon in multi-account mode)
9 #[arg(short = 'a', long)]
10 pub account: Option<String>,
12 /// TCP host and port of signal-cli daemon
13 #[arg(long, conflicts_with = "json_rpc_http")]
14 pub json_rpc_tcp: Option<Option<SocketAddr>>,
16 /// UNIX socket address and port of signal-cli daemon
17 #[arg(long, conflicts_with = "json_rpc_tcp")]
18 pub json_rpc_socket: Option<Option<OsString>>,
20 /// HTTP URL of signal-cli daemon
21 #[arg(long, conflicts_with = "json_rpc_socket")]
22 pub json_rpc_http: Option<Option<String>>,
24 #[arg(value_enum, long, default_value_t = OutputTypes::Json)]
25 pub output: OutputTypes,
30 #[command(subcommand)]
31 pub command: CliCommands,
34 #[derive(ValueEnum, Clone, Debug)]
35 #[value(rename_all = "kebab-case")]
36 pub enum OutputTypes {
41 #[allow(clippy::large_enum_variant)]
42 #[derive(Subcommand, Debug)]
43 #[command(rename_all = "camelCase", version=crate_version!())]
44 pub enum CliCommands {
49 #[command(rename_all = "kebab-case")]
51 recipient: Vec<String>,
53 #[arg(short = 'g', long)]
54 group_id: Vec<String>,
56 DeleteLocalAccountData {
57 #[arg(long = "ignore-registered")]
58 ignore_registered: Option<bool>,
61 recipient: Vec<String>,
68 #[arg(short = 'n', long)]
73 recipient: Vec<String>,
74 #[arg(short = 'a', long = "all-recipients")]
77 blocked: Option<bool>,
83 #[arg(short = 'd', long)]
85 #[arg(short = 'g', long = "group-id")]
86 group_id: Vec<String>,
89 #[arg(short = 'n', long)]
90 number: Option<String>,
94 #[arg(short = 'g', long = "group-id")]
102 #[arg(short = 't', long, default_value_t = 3.0)]
106 #[arg(short = 'v', long)]
109 captcha: Option<String>,
117 #[arg(short = 'd', long = "device-id")]
122 #[arg(short = 't', long = "target-timestamp")]
123 target_timestamp: u64,
125 recipient: Vec<String>,
127 #[arg(short = 'g', long = "group-id")]
128 group_id: Vec<String>,
130 #[arg(long = "note-to-self")]
133 #[command(rename_all = "kebab-case")]
135 recipient: Vec<String>,
137 #[arg(short = 'g', long)]
138 group_id: Vec<String>,
143 #[arg(short = 'e', long)]
146 #[arg(short = 'm', long)]
147 message: Option<String>,
149 #[arg(short = 'a', long)]
150 attachment: Vec<String>,
153 mention: Vec<String>,
156 quote_timestamp: Option<u64>,
159 quote_author: Option<String>,
162 quote_message: Option<String>,
165 quote_mention: Vec<String>,
168 sticker: Option<String>,
171 story_timestamp: Option<u64>,
174 story_author: Option<String>,
177 SendPaymentNotification {
187 recipient: Vec<String>,
189 #[arg(short = 'g', long = "group-id")]
190 group_id: Vec<String>,
192 #[arg(long = "note-to-self")]
195 #[arg(short = 'e', long)]
198 #[arg(short = 'a', long = "target-author")]
199 target_author: String,
201 #[arg(short = 't', long = "target-timestamp")]
202 target_timestamp: u64,
204 #[arg(short = 'r', long)]
213 #[arg(short = 't', long = "target-timestamp")]
214 target_timestamp: Vec<u64>,
216 #[arg(value_enum, long)]
221 recipient: Vec<String>,
223 #[arg(short = 'g', long = "group-id")]
224 group_id: Vec<String>,
226 #[arg(short = 's', long)]
232 SubmitRateLimitChallenge {
239 #[arg(short = 'a', long = "trust-all-known-keys")]
240 trust_all_known_keys: bool,
242 #[arg(short = 'v', long = "verified-safety-number")]
243 verified_safety_number: Option<String>,
245 #[command(rename_all = "kebab-case")]
247 recipient: Vec<String>,
249 #[arg(short = 'g', long)]
250 group_id: Vec<String>,
253 #[arg(long = "delete-account")]
254 delete_account: bool,
257 #[arg(short = 'n', long = "device-name")]
258 device_name: Option<String>,
260 UpdateConfiguration {
261 #[arg(long = "read-receipts")]
262 read_receipts: Option<bool>,
264 #[arg(long = "unidentified-delivery-indicators")]
265 unidentified_delivery_indicators: Option<bool>,
267 #[arg(long = "typing-indicators")]
268 typing_indicators: Option<bool>,
270 #[arg(long = "link-previews")]
271 link_previews: Option<bool>,
276 #[arg(short = 'e', long)]
277 expiration: Option<u32>,
279 #[arg(short = 'n', long)]
280 name: Option<String>,
283 #[arg(short = 'g', long = "group-id")]
284 group_id: Option<String>,
286 #[arg(short = 'n', long)]
287 name: Option<String>,
289 #[arg(short = 'd', long)]
290 description: Option<String>,
292 #[arg(short = 'a', long)]
293 avatar: Option<String>,
295 #[arg(short = 'm', long)]
298 #[arg(short = 'r', long = "remove-member")]
299 remove_member: Vec<String>,
304 #[arg(long = "remove-admin")]
305 remove_admin: Vec<String>,
313 #[arg(long = "reset-link")]
316 #[arg(value_enum, long)]
317 link: Option<LinkState>,
319 #[arg(value_enum, long = "set-permission-add-member")]
320 set_permission_add_member: Option<GroupPermission>,
322 #[arg(value_enum, long = "set-permission-edit-details")]
323 set_permission_edit_details: Option<GroupPermission>,
325 #[arg(value_enum, long = "set-permission-send-messages")]
326 set_permission_send_messages: Option<GroupPermission>,
328 #[arg(short = 'e', long)]
329 expiration: Option<u32>,
332 #[arg(long = "given-name")]
333 given_name: Option<String>,
335 #[arg(long = "family-name")]
336 family_name: Option<String>,
339 about: Option<String>,
341 #[arg(long = "about-emoji")]
342 about_emoji: Option<String>,
344 #[arg(long = "mobile-coin-address")]
345 mobile_coin_address: Option<String>,
348 avatar: Option<String>,
350 #[arg(long = "remove-avatar")]
357 verification_code: String,
359 #[arg(short = 'p', long)]
365 #[derive(ValueEnum, Clone, Debug)]
366 #[value(rename_all = "kebab-case")]
367 pub enum ReceiptType {
372 #[derive(ValueEnum, Clone, Debug)]
373 #[value(rename_all = "kebab-case")]
380 #[derive(ValueEnum, Clone, Debug)]
381 #[value(rename_all = "kebab-case")]
382 pub enum GroupPermission {