]> nmode's Git Repositories - signal-cli/blob - client/src/cli.rs
Update client dependencies
[signal-cli] / client / src / cli.rs
1 use clap::{crate_version, ArgEnum, Parser, Subcommand};
2 use std::{ffi::OsString, net::SocketAddr};
3
4 /// JSON-RPC client for signal-cli
5 #[derive(Parser, Debug)]
6 #[clap(rename_all = "kebab-case", version=crate_version!())]
7 pub struct Cli {
8 /// Account to use (for daemon in multi-account mode)
9 #[clap(short = 'a', long)]
10 pub account: Option<String>,
11
12 /// TCP host and port of signal-cli daemon
13 #[clap(long)]
14 pub json_rpc_tcp: Option<Option<SocketAddr>>,
15
16 /// UNIX socket address and port of signal-cli daemon
17 #[clap(long)]
18 pub json_rpc_socket: Option<Option<OsString>>,
19
20 #[clap(arg_enum, long, default_value_t = OutputTypes::Json)]
21 pub output: OutputTypes,
22
23 #[clap(long)]
24 pub verbose: bool,
25
26 #[clap(subcommand)]
27 pub command: CliCommands,
28 }
29
30 #[derive(ArgEnum, Clone, Debug)]
31 #[clap(rename_all = "kebab-case")]
32 pub enum OutputTypes {
33 PlainText,
34 Json,
35 }
36
37 #[allow(clippy::large_enum_variant)]
38 #[derive(Subcommand, Debug)]
39 #[clap(rename_all = "camelCase", version=crate_version!())]
40 pub enum CliCommands {
41 AddDevice {
42 #[clap(long)]
43 uri: String,
44 },
45 #[clap(rename_all = "kebab-case")]
46 Block {
47 recipient: Vec<String>,
48
49 #[clap(short = 'g', long)]
50 group_id: Vec<String>,
51 },
52 DeleteLocalAccountData {
53 #[clap(long = "ignore-registered")]
54 ignore_registered: Option<bool>,
55 },
56 GetUserStatus {
57 recipient: Vec<String>,
58 },
59 JoinGroup {
60 #[clap(long)]
61 uri: String,
62 },
63 Link {
64 #[clap(short = 'n', long)]
65 name: String,
66 },
67 ListAccounts,
68 ListContacts {
69 recipient: Vec<String>,
70 #[clap(short = 'a', long = "all-recipients")]
71 all_recipients: bool,
72 #[clap(long)]
73 blocked: Option<bool>,
74 #[clap(long)]
75 name: Option<String>,
76 },
77 ListDevices,
78 ListGroups {
79 #[clap(short = 'd', long)]
80 detailed: bool,
81 #[clap(short = 'g', long = "group-id")]
82 group_id: Vec<String>,
83 },
84 ListIdentities {
85 #[clap(short = 'n', long)]
86 number: Option<String>,
87 },
88 ListStickerPacks,
89 QuitGroup {
90 #[clap(short = 'g', long = "group-id")]
91 group_id: String,
92 #[clap(long)]
93 delete: bool,
94 #[clap(long)]
95 admin: Vec<String>,
96 },
97 Receive {
98 #[clap(short = 't', long, default_value_t = 3.0)]
99 timeout: f64,
100 },
101 Register {
102 #[clap(short = 'v', long)]
103 voice: bool,
104 #[clap(long)]
105 captcha: Option<String>,
106 },
107 RemoveContact {
108 recipient: String,
109 #[clap(long)]
110 forget: bool,
111 },
112 RemoveDevice {
113 #[clap(short = 'd', long = "device-id")]
114 device_id: u32,
115 },
116 RemovePin,
117 RemoteDelete {
118 #[clap(short = 't', long = "target-timestamp")]
119 target_timestamp: u64,
120
121 recipient: Vec<String>,
122
123 #[clap(short = 'g', long = "group-id")]
124 group_id: Vec<String>,
125
126 #[clap(long = "note-to-self")]
127 note_to_self: bool,
128 },
129 #[clap(rename_all = "kebab-case")]
130 Send {
131 recipient: Vec<String>,
132
133 #[clap(short = 'g', long)]
134 group_id: Vec<String>,
135
136 #[clap(long)]
137 note_to_self: bool,
138
139 #[clap(short = 'e', long)]
140 end_session: bool,
141
142 #[clap(short = 'm', long)]
143 message: Option<String>,
144
145 #[clap(short = 'a', long)]
146 attachment: Vec<String>,
147
148 #[clap(long)]
149 mention: Vec<String>,
150
151 #[clap(long)]
152 quote_timestamp: Option<u64>,
153
154 #[clap(long)]
155 quote_author: Option<String>,
156
157 #[clap(long)]
158 quote_message: Option<String>,
159
160 #[clap(long)]
161 quote_mention: Vec<String>,
162
163 #[clap(long)]
164 sticker: Option<String>,
165 },
166 SendContacts,
167 SendPaymentNotification {
168 recipient: String,
169
170 #[clap(long)]
171 receipt: String,
172
173 #[clap(long)]
174 note: String,
175 },
176 SendReaction {
177 recipient: Vec<String>,
178
179 #[clap(short = 'g', long = "group-id")]
180 group_id: Vec<String>,
181
182 #[clap(long = "note-to-self")]
183 note_to_self: bool,
184
185 #[clap(short = 'e', long)]
186 emoji: String,
187
188 #[clap(short = 'a', long = "target-author")]
189 target_author: String,
190
191 #[clap(short = 't', long = "target-timestamp")]
192 target_timestamp: u64,
193
194 #[clap(short = 'r', long)]
195 remove: bool,
196 },
197 SendReceipt {
198 recipient: String,
199
200 #[clap(short = 't', long = "target-timestamp")]
201 target_timestamp: Vec<u64>,
202
203 #[clap(arg_enum, long)]
204 r#type: ReceiptType,
205 },
206 SendSyncRequest,
207 SendTyping {
208 recipient: Vec<String>,
209
210 #[clap(short = 'g', long = "group-id")]
211 group_id: Vec<String>,
212
213 #[clap(short = 's', long)]
214 stop: bool,
215 },
216 SetPin {
217 pin: String,
218 },
219 SubmitRateLimitChallenge {
220 challenge: String,
221 captcha: String,
222 },
223 Trust {
224 recipient: String,
225
226 #[clap(short = 'a', long = "trust-all-known-keys")]
227 trust_all_known_keys: bool,
228
229 #[clap(short = 'v', long = "verified-safety-number")]
230 verified_safety_number: Option<String>,
231 },
232 #[clap(rename_all = "kebab-case")]
233 Unblock {
234 recipient: Vec<String>,
235
236 #[clap(short = 'g', long)]
237 group_id: Vec<String>,
238 },
239 Unregister {
240 #[clap(long = "delete-account")]
241 delete_account: bool,
242 },
243 UpdateAccount {
244 #[clap(short = 'n', long = "device-name")]
245 device_name: Option<String>,
246 },
247 UpdateConfiguration {
248 #[clap(long = "read-receipts")]
249 read_receipts: Option<bool>,
250
251 #[clap(long = "unidentified-delivery-indicators")]
252 unidentified_delivery_indicators: Option<bool>,
253
254 #[clap(long = "typing-indicators")]
255 typing_indicators: Option<bool>,
256
257 #[clap(long = "link-previews")]
258 link_previews: Option<bool>,
259 },
260 UpdateContact {
261 recipient: String,
262
263 #[clap(short = 'e', long)]
264 expiration: Option<u32>,
265
266 #[clap(short = 'n', long)]
267 name: Option<String>,
268 },
269 UpdateGroup {
270 #[clap(short = 'g', long = "group-id")]
271 group_id: Option<String>,
272
273 #[clap(short = 'n', long)]
274 name: Option<String>,
275
276 #[clap(short = 'd', long)]
277 description: Option<String>,
278
279 #[clap(short = 'a', long)]
280 avatar: Option<String>,
281
282 #[clap(short = 'm', long)]
283 member: Vec<String>,
284
285 #[clap(short = 'r', long = "remove-member")]
286 remove_member: Vec<String>,
287
288 #[clap(long)]
289 admin: Vec<String>,
290
291 #[clap(long = "remove-admin")]
292 remove_admin: Vec<String>,
293
294 #[clap(long)]
295 ban: Vec<String>,
296
297 #[clap(long)]
298 unban: Vec<String>,
299
300 #[clap(long = "reset-link")]
301 reset_link: bool,
302
303 #[clap(arg_enum, long)]
304 link: Option<LinkState>,
305
306 #[clap(arg_enum, long = "set-permission-add-member")]
307 set_permission_add_member: Option<GroupPermission>,
308
309 #[clap(arg_enum, long = "set-permission-edit-details")]
310 set_permission_edit_details: Option<GroupPermission>,
311
312 #[clap(arg_enum, long = "set-permission-send-messages")]
313 set_permission_send_messages: Option<GroupPermission>,
314
315 #[clap(short = 'e', long)]
316 expiration: Option<u32>,
317 },
318 UpdateProfile {
319 #[clap(long = "given-name")]
320 given_name: Option<String>,
321
322 #[clap(long = "family-name")]
323 family_name: Option<String>,
324
325 #[clap(long)]
326 about: Option<String>,
327
328 #[clap(long = "about-emoji")]
329 about_emoji: Option<String>,
330
331 #[clap(long = "mobile-coin-address")]
332 mobile_coin_address: Option<String>,
333
334 #[clap(long)]
335 avatar: Option<String>,
336
337 #[clap(long = "remove-avatar")]
338 remove_avatar: bool,
339 },
340 UploadStickerPack {
341 path: String,
342 },
343 Verify {
344 verification_code: String,
345
346 #[clap(short = 'p', long)]
347 pin: Option<String>,
348 },
349 Version,
350 }
351
352 #[derive(ArgEnum, Clone, Debug)]
353 #[clap(rename_all = "kebab-case")]
354 pub enum ReceiptType {
355 Read,
356 Viewed,
357 }
358
359 #[derive(ArgEnum, Clone, Debug)]
360 #[clap(rename_all = "kebab-case")]
361 pub enum LinkState {
362 Enabled,
363 EnabledWithApproval,
364 Disabled,
365 }
366
367 #[derive(ArgEnum, Clone, Debug)]
368 #[clap(rename_all = "kebab-case")]
369 pub enum GroupPermission {
370 EveryMember,
371 OnlyAdmins,
372 }