slack_blocks/elems/
mod.rs1use serde::{Deserialize, Serialize};
17
18use crate::convert;
19#[cfg(feature = "validation")]
20use crate::val_helpr::ValidationResult;
21
22pub mod button;
23pub mod checkboxes;
24pub mod date_picker;
25pub mod image;
26pub mod overflow;
27pub mod radio;
28pub mod select;
29pub mod text_input;
30
31#[doc(inline)]
32pub use button::Button;
33#[doc(inline)]
34pub use checkboxes::Checkboxes;
35#[doc(inline)]
36pub use date_picker::DatePicker;
37#[doc(inline)]
38pub use image::Image;
39#[doc(inline)]
40pub use overflow::Overflow;
41#[doc(inline)]
42pub use radio::Radio;
43#[doc(inline)]
44pub use text_input::TextInput;
45
46#[derive(Clone, Debug, Deserialize, Hash, PartialEq, Serialize)]
61#[serde(tag = "type", rename_all = "snake_case")]
62pub enum BlockElement<'a> {
63 Button(Button<'a>),
65 Checkboxes(Checkboxes<'a>),
67 Image(Image<'a>),
69
70 #[serde(rename = "datepicker")]
72 DatePicker(DatePicker<'a>),
73
74 Overflow(Overflow<'a>),
76
77 RadioButtons(Radio<'a>),
79
80 #[serde(rename = "plain_text_input")]
82 TextInput(TextInput<'a>),
83
84 #[serde(rename = "channels_select")]
86 SelectPublicChannel(select::PublicChannel<'a>),
87
88 #[serde(rename = "conversations_select")]
90 SelectConversation(select::Conversation<'a>),
91
92 #[serde(rename = "users_select")]
94 SelectUser(select::User<'a>),
95
96 #[serde(rename = "external_select")]
98 SelectExternal(select::External<'a>),
99
100 #[serde(rename = "static_select")]
102 SelectStatic(select::Static<'a>),
103
104 #[serde(rename = "multi_static_select")]
106 MultiSelectStatic(select::multi::Static<'a>),
107
108 #[serde(rename = "multi_users_select")]
110 MultiSelectUser(select::multi::User<'a>),
111
112 #[serde(rename = "multi_external_select")]
114 MultiSelectExternal(select::multi::External<'a>),
115
116 #[serde(rename = "multi_conversations_select")]
118 MultiSelectConversation(select::multi::Conversation<'a>),
119
120 #[serde(rename = "multi_channels_select")]
122 MultiSelectPublicChannel(select::multi::PublicChannel<'a>),
123}
124
125impl<'a> BlockElement<'a> {
126 #[cfg(feature = "validation")]
139 #[cfg_attr(docsrs, doc(cfg(feature = "validation")))]
140 pub fn validate(&self) -> ValidationResult {
141 use BlockElement::*;
142
143 match self {
144 | Button(cts) => cts.validate(),
145 | SelectPublicChannel(cts) => cts.validate(),
146 | SelectConversation(cts) => cts.validate(),
147 | SelectUser(cts) => cts.validate(),
148 | SelectExternal(cts) => cts.validate(),
149 | SelectStatic(cts) => cts.validate(),
150 | MultiSelectPublicChannel(cts) => cts.validate(),
151 | MultiSelectConversation(cts) => cts.validate(),
152 | MultiSelectUser(cts) => cts.validate(),
153 | MultiSelectExternal(cts) => cts.validate(),
154 | MultiSelectStatic(cts) => cts.validate(),
155 | RadioButtons(cts) => cts.validate(),
156 | Overflow(cts) => cts.validate(),
157 | Checkboxes(cts) => cts.validate(),
158 | Image(cts) => cts.validate(),
159 | DatePicker(cts) => cts.validate(),
160 | TextInput(cts) => cts.validate(),
161 }
162 }
163}
164
165convert!(impl<'a> From<Button<'a>> for BlockElement<'a> => |b| BlockElement::Button(b));
166convert!(impl<'a> From<Radio<'a>> for BlockElement<'a> => |b| BlockElement::RadioButtons(b));
167convert!(impl<'a> From<TextInput<'a>> for BlockElement<'a> => |t| BlockElement::TextInput(t));
168convert!(impl<'a> From<Overflow<'a>> for BlockElement<'a> => |t| BlockElement::Overflow(t));
169convert!(impl<'a> From<DatePicker<'a>> for BlockElement<'a> => |t| BlockElement::DatePicker(t));
170convert!(impl<'a> From<Checkboxes<'a>> for BlockElement<'a> => |t| BlockElement::Checkboxes(t));
171convert!(impl<'a> From<Image<'a>> for BlockElement<'a> => |t| BlockElement::Image(t));
172
173convert!(impl<'a> From<select::Static<'a>> for BlockElement<'a> => |s| BlockElement::SelectStatic(s));
174convert!(impl<'a> From<select::External<'a>> for BlockElement<'a> => |s| BlockElement::SelectExternal(s));
175convert!(impl<'a> From<select::PublicChannel<'a>> for BlockElement<'a> => |s| BlockElement::SelectPublicChannel(s));
176convert!(impl<'a> From<select::Conversation<'a>> for BlockElement<'a> => |s| BlockElement::SelectConversation(s));
177convert!(impl<'a> From<select::User<'a>> for BlockElement<'a> => |s| BlockElement::SelectUser(s));
178
179convert!(impl<'a> From<select::multi::Static<'a>> for BlockElement<'a> => |s| BlockElement::MultiSelectStatic(s));
180convert!(impl<'a> From<select::multi::User<'a>> for BlockElement<'a> => |s| BlockElement::MultiSelectUser(s));
181convert!(impl<'a> From<select::multi::Conversation<'a>> for BlockElement<'a> => |s| BlockElement::MultiSelectConversation(s));
182convert!(impl<'a> From<select::multi::External<'a>> for BlockElement<'a> => |s| BlockElement::MultiSelectExternal(s));
183convert!(impl<'a> From<select::multi::PublicChannel<'a>> for BlockElement<'a> => |s| BlockElement::MultiSelectPublicChannel(s));