slack_web_api/entity/block_kit/
block_element.rs

1use crate::{
2    CompositionObjectConfirmationDialog, CompositionObjectConversationFilter,
3    CompositionObjectDispatchActionConfiguration, CompositionObjectOption,
4    CompositionObjectOptionGroup, CompositionObjectText, CompositionObjectWorkflow,
5    SlackBlockKitCompositionObject,
6};
7use serde_derive::{Deserialize, Serialize};
8
9/// https://api.slack.com/reference/block-kit/block-elements
10#[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/// https://api.slack.com/reference/block-kit/block-elements#button
38#[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/// https://api.slack.com/reference/block-kit/block-elements#checkboxes
68#[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/// https://api.slack.com/reference/block-kit/block-elements#datepicker
94#[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/// https://api.slack.com/reference/block-kit/block-elements#datetimepicker
120#[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/// https://api.slack.com/reference/block-kit/block-elements#email
144#[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/// https://api.slack.com/reference/block-kit/block-elements#image
170#[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/// https://api.slack.com/reference/block-kit/block-elements#multi_select
190#[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/// https://api.slack.com/reference/block-kit/block-elements#external_multi_select
222#[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/// https://api.slack.com/reference/block-kit/block-elements#external_multi_select
252#[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/// https://api.slack.com/reference/block-kit/block-elements#conversation_multi_select
280#[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/// https://api.slack.com/reference/block-kit/block-elements#channel_multi_select
312#[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/// https://api.slack.com/reference/block-kit/block-elements#number
340#[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/// https://api.slack.com/reference/block-kit/block-elements#overflow
372#[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/// https://api.slack.com/reference/block-kit/block-elements#input
394#[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/// https://api.slack.com/reference/block-kit/block-elements#radio
426#[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/// https://api.slack.com/reference/block-kit/block-elements#select
452#[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/// https://api.slack.com/reference/block-kit/block-elements#external_select
482#[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/// https://api.slack.com/reference/block-kit/block-elements#external_select
510#[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/// https://api.slack.com/reference/block-kit/block-elements#conversations_select
536#[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/// https://api.slack.com/reference/block-kit/block-elements#channels_select
568#[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/// https://api.slack.com/reference/block-kit/block-elements#timepicker
596#[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/// https://api.slack.com/reference/block-kit/block-elements#url
626#[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/// https://api.slack.com/reference/block-kit/block-elements#workflow_button
652#[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}