1use crate::{
2 CompositionObjectConfirmationDialog, CompositionObjectConversationFilter,
3 CompositionObjectDispatchActionConfiguration, CompositionObjectOption,
4 CompositionObjectOptionGroup, CompositionObjectText, CompositionObjectWorkflow,
5 SlackBlockKitCompositionObject,
6};
7use serde_derive::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
11pub enum SlackBlockElement {
12 Button(BlockElementButton),
13 Checkbox(BlockElementCheckbox),
14 DatePicker(BlockElementDatePicker),
15 DatetimePicker(BlockElementDatetimePicker),
16 EmailTextInput(BlockElementEmailTextInput),
17 Image(BlockElementImage),
18 MultiSelectMenu(BlockElementMultiSelectMenu),
19 ExternalDataSource(BlockElementExternalDataSource),
20 MultiUsersSelect(BlockElementMultiUsersSelect),
21 MultiConversationsSelect(BlockElementMultiConversationsSelect),
22 MultiChannelSelect(BlockElementMultiChannelSelect),
23 NumberInput(BlockElementNumberInput),
24 OverflowMenu(BlockElementOverflowMenu),
25 PlaneTextInput(BlockElementPlaneTextInput),
26 Radio(BlockElementRadio),
27 SelectMenuStaticOption(BlockElementSelectMenuStaticOption),
28 SelectMenuExternalDataSource(BlockElementSelectMenuExternalDataSource),
29 SelectMenuUsers(BlockElementSelectMenuUsers),
30 SelectMenuConversations(BlockElementSelectMenuConversations),
31 SelectMenuPublicChannel(BlockElementSelectMenuPublicChannel),
32 TimePicker(BlockElementTimePicker),
33 UrlInput(BlockElementUrlInput),
34 WorkflowButton(BlockElementWorkflowButton),
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct BlockElementButton {
40 #[serde(rename = "type")]
41 pub element_type: String,
42 pub text: CompositionObjectText,
43 pub action_id: String,
44 pub url: Option<String>,
45 pub value: Option<String>,
46 pub style: Option<String>,
47 pub confirm: Option<CompositionObjectConfirmationDialog>,
48 pub accessibility_label: Option<String>,
49}
50
51impl Default for BlockElementButton {
52 fn default() -> Self {
53 BlockElementButton {
54 element_type: "button".to_string(),
55
56 text: Default::default(),
57 action_id: "".to_string(),
58 url: None,
59 value: None,
60 style: None,
61 confirm: None,
62 accessibility_label: None,
63 }
64 }
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct BlockElementCheckbox {
70 #[serde(rename = "type")]
71 pub element_type: String,
72 pub action_id: String,
73 pub options: Vec<CompositionObjectOption>,
74 pub initial_options: Option<Vec<CompositionObjectOption>>,
75 pub confirm: Option<Vec<CompositionObjectConfirmationDialog>>,
76 pub focus_on_load: Option<bool>,
77}
78
79impl Default for BlockElementCheckbox {
80 fn default() -> Self {
81 BlockElementCheckbox {
82 element_type: "checkboxes".to_string(),
83
84 action_id: "".to_string(),
85 options: vec![],
86 initial_options: None,
87 confirm: None,
88 focus_on_load: None,
89 }
90 }
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
95pub struct BlockElementDatePicker {
96 #[serde(rename = "type")]
97 pub element_type: String,
98 pub action_id: String,
99 pub initial_date: Option<String>,
100 pub confirm: Option<CompositionObjectConfirmationDialog>,
101 pub focus_on_load: Option<bool>,
102 pub placeholder: Option<CompositionObjectText>,
103}
104
105impl Default for BlockElementDatePicker {
106 fn default() -> Self {
107 BlockElementDatePicker {
108 element_type: "datepicker".to_string(),
109
110 action_id: "".to_string(),
111 initial_date: None,
112 confirm: None,
113 focus_on_load: None,
114 placeholder: None,
115 }
116 }
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize)]
121pub struct BlockElementDatetimePicker {
122 #[serde(rename = "type")]
123 pub element_type: String,
124 pub action_id: String,
125 pub initial_date_time: Option<i32>,
126 pub confirm: Option<CompositionObjectConfirmationDialog>,
127 pub focus_on_load: Option<bool>,
128}
129
130impl Default for BlockElementDatetimePicker {
131 fn default() -> Self {
132 BlockElementDatetimePicker {
133 element_type: "datetimepicker".to_string(),
134
135 action_id: "".to_string(),
136 initial_date_time: None,
137 confirm: None,
138 focus_on_load: None,
139 }
140 }
141}
142
143#[derive(Debug, Clone, Serialize, Deserialize)]
145pub struct BlockElementEmailTextInput {
146 #[serde(rename = "type")]
147 pub element_type: String,
148 pub action_id: String,
149 pub initial_value: Option<String>,
150 pub dispatch_action_config: Option<CompositionObjectDispatchActionConfiguration>,
151 pub focus_on_load: Option<bool>,
152 pub placeholder: Option<CompositionObjectText>,
153}
154
155impl Default for BlockElementEmailTextInput {
156 fn default() -> Self {
157 BlockElementEmailTextInput {
158 element_type: "email_text_input".to_string(),
159
160 action_id: "".to_string(),
161 initial_value: None,
162 dispatch_action_config: None,
163 focus_on_load: None,
164 placeholder: None,
165 }
166 }
167}
168
169#[derive(Debug, Clone, Serialize, Deserialize)]
171pub struct BlockElementImage {
172 #[serde(rename = "type")]
173 pub element_type: String,
174 pub image_url: String,
175 pub alt_text: String,
176}
177
178impl Default for BlockElementImage {
179 fn default() -> Self {
180 BlockElementImage {
181 element_type: "image".to_string(),
182
183 image_url: "".to_string(),
184 alt_text: "".to_string(),
185 }
186 }
187}
188
189#[derive(Debug, Clone, Serialize, Deserialize)]
191pub struct BlockElementMultiSelectMenu {
192 #[serde(rename = "type")]
193 pub element_type: String,
194 pub action_id: String,
195 pub options: Vec<CompositionObjectOption>,
196 pub option_groups: Option<Vec<CompositionObjectOptionGroup>>,
197 pub initial_options: Option<Vec<SlackBlockKitCompositionObject>>,
198 pub confirm: Option<CompositionObjectConfirmationDialog>,
199 pub max_selected_items: Option<u32>,
200 pub focus_on_load: Option<bool>,
201 pub placeholder: Option<CompositionObjectText>,
202}
203
204impl Default for BlockElementMultiSelectMenu {
205 fn default() -> Self {
206 BlockElementMultiSelectMenu {
207 element_type: "multi_static_select".to_string(),
208
209 action_id: "".to_string(),
210 options: vec![],
211 option_groups: None,
212 initial_options: None,
213 confirm: None,
214 max_selected_items: None,
215 focus_on_load: None,
216 placeholder: None,
217 }
218 }
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize)]
223pub struct BlockElementExternalDataSource {
224 #[serde(rename = "type")]
225 pub element_type: String,
226 pub action_id: String,
227 pub min_query_length: Option<i32>,
228 pub initial_options: Option<Vec<SlackBlockKitCompositionObject>>,
229 pub confirm: Option<CompositionObjectConfirmationDialog>,
230 pub max_selected_items: Option<u32>,
231 pub focus_on_load: Option<bool>,
232 pub placeholder: Option<CompositionObjectText>,
233}
234
235impl Default for BlockElementExternalDataSource {
236 fn default() -> Self {
237 BlockElementExternalDataSource {
238 element_type: "multi_external_select".to_string(),
239
240 action_id: "".to_string(),
241 min_query_length: None,
242 initial_options: None,
243 confirm: None,
244 max_selected_items: None,
245 focus_on_load: None,
246 placeholder: None,
247 }
248 }
249}
250
251#[derive(Debug, Clone, Serialize, Deserialize)]
253pub struct BlockElementMultiUsersSelect {
254 #[serde(rename = "type")]
255 pub element_type: String,
256 pub action_id: String,
257 pub initial_options: Option<Vec<SlackBlockKitCompositionObject>>,
258 pub confirm: Option<CompositionObjectConfirmationDialog>,
259 pub max_selected_items: Option<u32>,
260 pub focus_on_load: Option<bool>,
261 pub placeholder: Option<CompositionObjectText>,
262}
263
264impl Default for BlockElementMultiUsersSelect {
265 fn default() -> Self {
266 BlockElementMultiUsersSelect {
267 element_type: "multi_users_select".to_string(),
268
269 action_id: "".to_string(),
270 initial_options: None,
271 confirm: None,
272 max_selected_items: None,
273 focus_on_load: None,
274 placeholder: None,
275 }
276 }
277}
278
279#[derive(Debug, Clone, Serialize, Deserialize)]
281pub struct BlockElementMultiConversationsSelect {
282 #[serde(rename = "type")]
283 pub element_type: String,
284 pub action_id: String,
285 pub initial_conversations: Option<Vec<String>>,
286 pub default_to_current_conversation: Option<bool>,
287 pub confirm: Option<CompositionObjectConfirmationDialog>,
288 pub max_selected_items: Option<u32>,
289 pub filter: Option<CompositionObjectConversationFilter>,
290 pub focus_on_load: Option<bool>,
291 pub placeholder: Option<CompositionObjectText>,
292}
293
294impl Default for BlockElementMultiConversationsSelect {
295 fn default() -> Self {
296 BlockElementMultiConversationsSelect {
297 element_type: "multi_conversations_select".to_string(),
298
299 action_id: "".to_string(),
300 initial_conversations: None,
301 default_to_current_conversation: None,
302 confirm: None,
303 max_selected_items: None,
304 filter: None,
305 focus_on_load: None,
306 placeholder: None,
307 }
308 }
309}
310
311#[derive(Debug, Clone, Serialize, Deserialize)]
313pub struct BlockElementMultiChannelSelect {
314 #[serde(rename = "type")]
315 pub element_type: String,
316 pub action_id: String,
317 pub initial_channels: Option<Vec<String>>,
318 pub confirm: Option<CompositionObjectConfirmationDialog>,
319 pub max_selected_items: Option<u32>,
320 pub focus_on_load: Option<bool>,
321 pub placeholder: Option<CompositionObjectText>,
322}
323
324impl Default for BlockElementMultiChannelSelect {
325 fn default() -> Self {
326 BlockElementMultiChannelSelect {
327 element_type: "multi_channels_select".to_string(),
328
329 action_id: "".to_string(),
330 initial_channels: None,
331 confirm: None,
332 max_selected_items: None,
333 focus_on_load: None,
334 placeholder: None,
335 }
336 }
337}
338
339#[derive(Debug, Clone, Serialize, Deserialize)]
341pub struct BlockElementNumberInput {
342 #[serde(rename = "type")]
343 pub element_type: String,
344 pub is_decimal_allowed: bool,
345 pub action_id: String,
346 pub initial_value: Option<String>,
347 pub min_value: Option<String>,
348 pub max_value: Option<String>,
349 pub dispatch_action_config: Option<CompositionObjectConfirmationDialog>,
350 pub focus_on_load: Option<bool>,
351 pub placeholder: Option<CompositionObjectText>,
352}
353
354impl Default for BlockElementNumberInput {
355 fn default() -> Self {
356 BlockElementNumberInput {
357 element_type: "number_input".to_string(),
358
359 is_decimal_allowed: false,
360 action_id: "".to_string(),
361 initial_value: None,
362 min_value: None,
363 max_value: None,
364 dispatch_action_config: None,
365 focus_on_load: None,
366 placeholder: None,
367 }
368 }
369}
370
371#[derive(Debug, Clone, Serialize, Deserialize)]
373pub struct BlockElementOverflowMenu {
374 #[serde(rename = "type")]
375 pub element_type: String,
376 pub action_id: String,
377 pub options: CompositionObjectOption,
378 pub confirm: Option<CompositionObjectConfirmationDialog>,
379}
380
381impl Default for BlockElementOverflowMenu {
382 fn default() -> Self {
383 BlockElementOverflowMenu {
384 element_type: "overflow".to_string(),
385
386 action_id: "".to_string(),
387 options: Default::default(),
388 confirm: None,
389 }
390 }
391}
392
393#[derive(Debug, Clone, Serialize, Deserialize)]
395pub struct BlockElementPlaneTextInput {
396 #[serde(rename = "type")]
397 pub element_type: String,
398 pub action_id: String,
399 pub initial_value: Option<String>,
400 pub multiline: Option<bool>,
401 pub min_length: Option<i32>,
402 pub max_length: Option<i32>,
403 pub dispatch_action_config: Option<CompositionObjectDispatchActionConfiguration>,
404 pub focus_on_load: Option<bool>,
405 pub placeholder: Option<CompositionObjectText>,
406}
407
408impl Default for BlockElementPlaneTextInput {
409 fn default() -> Self {
410 BlockElementPlaneTextInput {
411 element_type: "plain_text_input".to_string(),
412
413 action_id: "".to_string(),
414 initial_value: None,
415 multiline: None,
416 min_length: None,
417 max_length: None,
418 dispatch_action_config: None,
419 focus_on_load: None,
420 placeholder: None,
421 }
422 }
423}
424
425#[derive(Debug, Clone, Serialize, Deserialize)]
427pub struct BlockElementRadio {
428 #[serde(rename = "type")]
429 pub element_type: String,
430 pub action_id: String,
431 pub options: Vec<CompositionObjectOption>,
432 pub initial_option: Option<CompositionObjectOption>,
433 pub confirm: Option<CompositionObjectConfirmationDialog>,
434 pub focus_on_load: Option<bool>,
435}
436
437impl Default for BlockElementRadio {
438 fn default() -> Self {
439 BlockElementRadio {
440 element_type: "radio_buttons".to_string(),
441
442 action_id: "".to_string(),
443 options: vec![],
444 initial_option: None,
445 confirm: None,
446 focus_on_load: None,
447 }
448 }
449}
450
451#[derive(Debug, Clone, Serialize, Deserialize)]
453pub struct BlockElementSelectMenuStaticOption {
454 #[serde(rename = "type")]
455 pub element_type: String,
456 pub action_id: String,
457 pub options: Vec<CompositionObjectOption>,
458 pub option_groups: Option<Vec<CompositionObjectOptionGroup>>,
459 pub initial_option: Option<CompositionObjectOption>,
460 pub confirm: Option<CompositionObjectConfirmationDialog>,
461 pub focus_on_load: Option<bool>,
462 pub placeholder: Option<CompositionObjectText>,
463}
464
465impl Default for BlockElementSelectMenuStaticOption {
466 fn default() -> Self {
467 BlockElementSelectMenuStaticOption {
468 element_type: "static_select".to_string(),
469
470 action_id: "".to_string(),
471 options: vec![],
472 option_groups: None,
473 initial_option: None,
474 confirm: None,
475 focus_on_load: None,
476 placeholder: None,
477 }
478 }
479}
480
481#[derive(Debug, Clone, Serialize, Deserialize)]
483pub struct BlockElementSelectMenuExternalDataSource {
484 #[serde(rename = "type")]
485 pub element_type: String,
486 pub action_id: String,
487 pub initial_option: Option<CompositionObjectOption>,
488 pub min_query_length: Option<i32>,
489 pub confirm: Option<CompositionObjectConfirmationDialog>,
490 pub focus_on_load: Option<bool>,
491 pub placeholder: Option<CompositionObjectText>,
492}
493
494impl Default for BlockElementSelectMenuExternalDataSource {
495 fn default() -> Self {
496 BlockElementSelectMenuExternalDataSource {
497 element_type: "external_select".to_string(),
498
499 action_id: "".to_string(),
500 initial_option: None,
501 min_query_length: None,
502 confirm: None,
503 focus_on_load: None,
504 placeholder: None,
505 }
506 }
507}
508
509#[derive(Debug, Clone, Serialize, Deserialize)]
511pub struct BlockElementSelectMenuUsers {
512 #[serde(rename = "type")]
513 pub element_type: String,
514 pub action_id: String,
515 pub initial_user: Option<String>,
516 pub confirm: Option<CompositionObjectConfirmationDialog>,
517 pub focus_on_load: Option<bool>,
518 pub placeholder: Option<CompositionObjectText>,
519}
520
521impl Default for BlockElementSelectMenuUsers {
522 fn default() -> Self {
523 BlockElementSelectMenuUsers {
524 element_type: "users_select".to_string(),
525
526 action_id: "".to_string(),
527 initial_user: None,
528 confirm: None,
529 focus_on_load: None,
530 placeholder: None,
531 }
532 }
533}
534
535#[derive(Debug, Clone, Serialize, Deserialize)]
537pub struct BlockElementSelectMenuConversations {
538 #[serde(rename = "type")]
539 pub element_type: String,
540 pub action_id: String,
541 pub initial_conversation: Option<String>,
542 pub default_to_current_conversation: Option<bool>,
543 pub confirm: Option<CompositionObjectConfirmationDialog>,
544 pub response_url_enabled: Option<bool>,
545 pub filter: Option<CompositionObjectConversationFilter>,
546 pub focus_on_load: Option<bool>,
547 pub placeholder: Option<CompositionObjectText>,
548}
549
550impl Default for BlockElementSelectMenuConversations {
551 fn default() -> Self {
552 BlockElementSelectMenuConversations {
553 element_type: "conversations_select".to_string(),
554
555 action_id: "".to_string(),
556 initial_conversation: None,
557 default_to_current_conversation: None,
558 confirm: None,
559 response_url_enabled: None,
560 filter: None,
561 focus_on_load: None,
562 placeholder: None,
563 }
564 }
565}
566
567#[derive(Debug, Clone, Serialize, Deserialize)]
569pub struct BlockElementSelectMenuPublicChannel {
570 #[serde(rename = "type")]
571 pub element_type: String,
572 pub action_id: String,
573 pub initial_channel: Option<String>,
574 pub confirm: Option<CompositionObjectConfirmationDialog>,
575 pub response_url_enabled: Option<bool>,
576 pub focus_on_load: Option<bool>,
577 pub placeholder: Option<CompositionObjectText>,
578}
579
580impl Default for BlockElementSelectMenuPublicChannel {
581 fn default() -> Self {
582 BlockElementSelectMenuPublicChannel {
583 element_type: "channels_select".to_string(),
584
585 action_id: "".to_string(),
586 initial_channel: None,
587 confirm: None,
588 response_url_enabled: None,
589 focus_on_load: None,
590 placeholder: None,
591 }
592 }
593}
594
595#[derive(Debug, Clone, Serialize, Deserialize)]
597pub struct BlockElementTimePicker {
598 #[serde(rename = "type")]
599 pub element_type: String,
600 pub action_id: String,
601 pub initial_time: Option<String>,
602 pub confirm: Option<CompositionObjectConfirmationDialog>,
603 pub response_url_enabled: Option<bool>,
604 pub focus_on_load: Option<bool>,
605 pub placeholder: Option<CompositionObjectText>,
606 pub timezone: Option<String>,
607}
608
609impl Default for BlockElementTimePicker {
610 fn default() -> Self {
611 BlockElementTimePicker {
612 element_type: "timepicker".to_string(),
613
614 action_id: "".to_string(),
615 initial_time: None,
616 confirm: None,
617 response_url_enabled: None,
618 focus_on_load: None,
619 placeholder: None,
620 timezone: None,
621 }
622 }
623}
624
625#[derive(Debug, Clone, Serialize, Deserialize)]
627pub struct BlockElementUrlInput {
628 #[serde(rename = "type")]
629 pub element_type: String,
630 pub action_id: String,
631 pub initial_value: Option<String>,
632 pub dispatch_action_config: Option<CompositionObjectDispatchActionConfiguration>,
633 pub placeholder: Option<CompositionObjectText>,
634 pub timezone: Option<String>,
635}
636
637impl Default for BlockElementUrlInput {
638 fn default() -> Self {
639 BlockElementUrlInput {
640 element_type: "url_text_input".to_string(),
641
642 action_id: "".to_string(),
643 initial_value: None,
644 dispatch_action_config: None,
645 placeholder: None,
646 timezone: None,
647 }
648 }
649}
650
651#[derive(Debug, Clone, Serialize, Deserialize)]
653pub struct BlockElementWorkflowButton {
654 #[serde(rename = "type")]
655 pub element_type: String,
656 pub text: CompositionObjectText,
657 pub workflow: CompositionObjectWorkflow,
658 pub style: Option<String>,
659 pub accessibility_label: Option<CompositionObjectText>,
660}
661
662impl Default for BlockElementWorkflowButton {
663 fn default() -> Self {
664 BlockElementWorkflowButton {
665 element_type: "workflow_button".to_string(),
666
667 text: Default::default(),
668 workflow: Default::default(),
669 style: None,
670 accessibility_label: None,
671 }
672 }
673}