slack_bk/
elements.rs

1use serde::{Deserialize, Serialize};
2
3use crate::composition::{self, Text};
4use crate::util::Style;
5
6#[derive(Debug, Deserialize, Serialize)]
7#[serde(rename_all = "snake_case", tag = "type")]
8pub enum Element {
9    Button(Button),
10    Checkboxes(CheckboxGroup),
11    #[serde(rename = "datepicker")]
12    DatePicker(DatePicker),
13    Image(Image),
14    MultiStaticSelect(MultiStaticSelect),
15    MultiExternalSelect(MultiExternalSelect),
16    MultiUsersSelect(MultiUsersSelect),
17    MultiConversationsSelect(MultiConversationsSelect),
18    MultiChannelsSelect(MultiChannelsSelect),
19    Overflow(OverflowMenu),
20    PlainTextInput(PlainTextInput),
21    RadioButtons(RadioButtonGroup),
22    StaticSelect(StaticSelect),
23    ExternalSelect(ExternalSelect),
24    UsersSelect(UsersSelect),
25    ConversationsSelect(ConversationsSelect),
26    ChannelsSelect(ChannelsSelect),
27    #[serde(rename = "timepicker")]
28    TimePicker(TimePicker),
29}
30
31#[derive(Debug, Deserialize, Serialize, Default)]
32pub struct Button {
33    pub text: Text,
34    pub action_id: String,
35
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub url: Option<String>,
38
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub value: Option<String>,
41
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub style: Option<Style>,
44
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub confirm: Option<composition::ConfirmationDialog>,
47}
48
49#[derive(Debug, Deserialize, Serialize, Default)]
50pub struct CheckboxGroup {
51    pub action_id: String,
52    pub options: Vec<composition::Option>,
53    pub initial_options: Option<Vec<composition::Option>>,
54    pub confirm: Option<composition::ConfirmationDialog>,
55}
56
57#[derive(Debug, Deserialize, Serialize, Default)]
58pub struct DatePicker {
59    pub action_id: String,
60    pub placeholder: Option<Text>,
61    pub initial_date: Option<String>,
62    pub confirm: Option<composition::ConfirmationDialog>,
63}
64
65#[derive(Debug, Deserialize, Serialize)]
66pub struct Image {
67    pub image_url: String,
68    pub alt_text: String,
69}
70
71#[derive(Debug, Deserialize, Serialize, Default)]
72pub struct MultiStaticSelect {
73    pub placeholder: Text,
74    pub action_id: String,
75    pub options: Vec<composition::Option>,
76
77    #[serde(default, skip_serializing_if = "Vec::is_empty")]
78    pub option_groups: Vec<composition::OptionGroup>,
79
80    #[serde(default, skip_serializing_if = "Vec::is_empty")]
81    pub initial_options: Vec<composition::Option>,
82
83    #[serde(default, skip_serializing_if = "Option::is_none")]
84    pub confirm: Option<composition::ConfirmationDialog>,
85
86    #[serde(default, skip_serializing_if = "Option::is_none")]
87    pub max_selected_items: Option<usize>,
88}
89
90#[derive(Debug, Deserialize, Serialize, Default)]
91pub struct MultiExternalSelect {
92    pub placeholder: Text,
93    pub action_id: String,
94
95    #[serde(default, skip_serializing_if = "Option::is_none")]
96    pub min_query_length: Option<usize>,
97
98    #[serde(default, skip_serializing_if = "Vec::is_empty")]
99    pub initial_options: Vec<composition::Option>,
100
101    #[serde(default, skip_serializing_if = "Option::is_none")]
102    pub confirm: Option<composition::ConfirmationDialog>,
103
104    pub max_selected_items: Option<usize>,
105}
106
107#[derive(Debug, Deserialize, Serialize, Default)]
108pub struct MultiUsersSelect {
109    pub placeholder: Text,
110    pub action_id: String,
111
112    #[serde(default, skip_serializing_if = "Vec::is_empty")]
113    pub initial_users: Vec<String>,
114
115    #[serde(default, skip_serializing_if = "Option::is_none")]
116    pub confirm: Option<composition::ConfirmationDialog>,
117
118    #[serde(default, skip_serializing_if = "Option::is_none")]
119    pub max_selected_items: Option<usize>,
120}
121
122#[derive(Debug, Deserialize, Serialize, Default)]
123pub struct MultiConversationsSelect {
124    pub placeholder: Text,
125    pub action_id: String,
126
127    #[serde(default, skip_serializing_if = "Vec::is_empty")]
128    pub initial_conversations: Vec<String>,
129
130    #[serde(default)]
131    pub default_to_current_conversation: bool,
132
133    #[serde(default, skip_serializing_if = "Option::is_none")]
134    pub confirm: Option<composition::ConfirmationDialog>,
135
136    #[serde(default, skip_serializing_if = "Option::is_none")]
137    pub max_selected_items: Option<usize>,
138
139    #[serde(default, skip_serializing_if = "Option::is_none")]
140    pub filter: Option<composition::FilterAction>,
141}
142
143#[derive(Debug, Deserialize, Serialize, Default)]
144pub struct MultiChannelsSelect {
145    pub placeholder: Text,
146    pub action_id: String,
147
148    #[serde(default, skip_serializing_if = "Vec::is_empty")]
149    pub initial_channels: Vec<String>,
150
151    #[serde(default, skip_serializing_if = "Option::is_none")]
152    pub confirm: Option<composition::ConfirmationDialog>,
153
154    #[serde(default, skip_serializing_if = "Option::is_none")]
155    pub max_selected_items: Option<usize>,
156}
157
158#[derive(Debug, Deserialize, Serialize, Default)]
159pub struct OverflowMenu {
160    pub action_id: String,
161    pub options: Vec<composition::Option>,
162
163    #[serde(default, skip_serializing_if = "Option::is_none")]
164    pub confirm: Option<composition::ConfirmationDialog>,
165}
166
167#[derive(Debug, Deserialize, Serialize, Default)]
168pub struct PlainTextInput {
169    pub action_id: String,
170
171    #[serde(default, skip_serializing_if = "Option::is_none")]
172    pub placeholder: Option<Text>,
173
174    #[serde(default, skip_serializing_if = "Option::is_none")]
175    pub initial_value: Option<String>,
176
177    #[serde(default)]
178    pub multiline: bool,
179
180    #[serde(default, skip_serializing_if = "Option::is_none")]
181    pub min_length: Option<usize>,
182
183    #[serde(default, skip_serializing_if = "Option::is_none")]
184    pub max_length: Option<usize>,
185
186    #[serde(default, skip_serializing_if = "Option::is_none")]
187    pub dispatch_action_config: Option<composition::DispatchAction>,
188}
189
190#[derive(Debug, Deserialize, Serialize, Default)]
191pub struct RadioButtonGroup {
192    action_id: String,
193    options: Vec<composition::Option>,
194    initial_option: Option<composition::Option>,
195    confirm: Option<composition::ConfirmationDialog>,
196}
197
198#[derive(Debug, Deserialize, Serialize, Default)]
199pub struct StaticSelect {
200    pub placeholder: Text,
201    pub action_id: String,
202    pub options: Vec<composition::Option>,
203
204    #[serde(default)]
205    pub option_groups: Vec<composition::OptionGroup>,
206
207    #[serde(default, skip_serializing_if = "Option::is_none")]
208    pub initial_option: Option<composition::Option>,
209
210    #[serde(default, skip_serializing_if = "Option::is_none")]
211    pub confirm: Option<composition::ConfirmationDialog>,
212}
213
214#[derive(Debug, Deserialize, Serialize, Default)]
215pub struct ExternalSelect {
216    pub placeholder: Text,
217    pub action_id: String,
218
219    #[serde(default, skip_serializing_if = "Option::is_none")]
220    pub initial_option: Option<composition::Option>,
221
222    #[serde(default, skip_serializing_if = "Option::is_none")]
223    pub min_query_length: Option<usize>,
224
225    #[serde(default, skip_serializing_if = "Option::is_none")]
226    pub confirm: Option<composition::ConfirmationDialog>,
227}
228
229#[derive(Debug, Deserialize, Serialize, Default)]
230pub struct UsersSelect {
231    pub placeholder: Text,
232    pub action_id: String,
233
234    #[serde(default, skip_serializing_if = "Option::is_none")]
235    pub initial_user: Option<String>,
236
237    #[serde(default, skip_serializing_if = "Option::is_none")]
238    pub confirm: Option<composition::ConfirmationDialog>,
239}
240
241#[derive(Debug, Deserialize, Serialize, Default)]
242pub struct ConversationsSelect {
243    pub placeholder: Text,
244    pub action_id: String,
245
246    #[serde(default, skip_serializing_if = "Option::is_none")]
247    pub initial_conversation: Option<String>,
248
249    #[serde(default)]
250    pub default_to_current_conversation: bool,
251
252    #[serde(default, skip_serializing_if = "Option::is_none")]
253    pub confirm: Option<composition::ConfirmationDialog>,
254
255    #[serde(default)]
256    pub response_url_enabled: bool,
257
258    #[serde(default, skip_serializing_if = "Option::is_none")]
259    pub filter: Option<composition::FilterAction>,
260}
261
262#[derive(Debug, Deserialize, Serialize, Default)]
263pub struct ChannelsSelect {
264    pub placeholder: Text,
265    pub action_id: String,
266
267    #[serde(default, skip_serializing_if = "Option::is_none")]
268    pub initial_channel: Option<String>,
269
270    #[serde(default, skip_serializing_if = "Option::is_none")]
271    pub confirm: Option<composition::ConfirmationDialog>,
272
273    #[serde(default)]
274    pub response_url_enabled: bool,
275}
276
277#[derive(Debug, Deserialize, Serialize, Default)]
278pub struct TimePicker {
279    #[serde(default, skip_serializing_if = "Option::is_none")]
280    pub placeholder: Option<Text>,
281
282    pub action_id: String,
283
284    #[serde(default, skip_serializing_if = "Option::is_none")]
285    pub initial_time: Option<String>,
286
287    #[serde(default, skip_serializing_if = "Option::is_none")]
288    pub confirm: Option<composition::ConfirmationDialog>,
289}