slack_messaging/blocks/elements/select_menus/
users.rs

1use crate::composition_objects::{ConfirmationDialog, Plain, Text};
2use crate::validators::*;
3
4use serde::Serialize;
5use slack_messaging_derive::Builder;
6
7/// [Select menu of users](https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#users_select)
8/// representation
9///
10/// # Fields and Validations
11///
12/// For more details, see the [official
13/// documentation](https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#users_select).
14///
15/// | Field | Type | Required | Validation |
16/// |-------|------|----------|------------|
17/// | action_id | String | No | Max length 255 characters |
18/// | initial_user | String | No | N/A |
19/// | confirm | [ConfirmationDialog] | No | N/A |
20/// | focus_on_load | bool | No | N/A |
21/// | placeholder | [Text]<[Plain]> | No | Max length 150 characters |
22///
23/// # Example
24///
25/// ```
26/// use slack_messaging::plain_text;
27/// use slack_messaging::blocks::elements::SelectMenuUsers;
28/// # use std::error::Error;
29///
30/// # fn try_main() -> Result<(), Box<dyn Error>> {
31/// let menu = SelectMenuUsers::builder()
32///     .action_id("text1234")
33///     .placeholder(plain_text!("Select an item")?)
34///     .build()?;
35///
36/// let expected = serde_json::json!({
37///     "type": "users_select",
38///     "action_id": "text1234",
39///     "placeholder": {
40///         "type": "plain_text",
41///         "text": "Select an item"
42///     }
43/// });
44///
45/// let json = serde_json::to_value(menu).unwrap();
46///
47/// assert_eq!(json, expected);
48///
49/// // If your object has any validation errors, the build method returns Result::Err
50/// let menu = SelectMenuUsers::builder()
51///     .action_id("text1234")
52///     .placeholder(plain_text!("{}", "verrrrry long text".repeat(100))?)
53///     .build();
54///
55/// assert!(menu.is_err());
56/// #     Ok(())
57/// # }
58/// # fn main() {
59/// #     try_main().unwrap()
60/// # }
61/// ```
62#[derive(Debug, Default, Clone, Serialize, PartialEq, Builder)]
63#[serde(tag = "type", rename = "users_select")]
64pub struct SelectMenuUsers {
65    #[serde(skip_serializing_if = "Option::is_none")]
66    #[builder(validate("text::max_255"))]
67    pub(crate) action_id: Option<String>,
68
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub(crate) initial_user: Option<String>,
71
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub(crate) confirm: Option<ConfirmationDialog>,
74
75    #[serde(skip_serializing_if = "Option::is_none")]
76    pub(crate) focus_on_load: Option<bool>,
77
78    #[serde(skip_serializing_if = "Option::is_none")]
79    #[builder(validate("text_object::max_150"))]
80    pub(crate) placeholder: Option<Text<Plain>>,
81}
82
83#[cfg(test)]
84mod tests {
85    use super::*;
86    use crate::composition_objects::test_helpers::*;
87    use crate::errors::*;
88
89    #[test]
90    fn it_implements_builder() {
91        let expected = SelectMenuUsers {
92            action_id: Some("select_0".into()),
93            initial_user: Some("User0".into()),
94            confirm: Some(confirm()),
95            focus_on_load: Some(true),
96            placeholder: Some(plain_text("Select item")),
97        };
98
99        let val = SelectMenuUsers::builder()
100            .set_action_id(Some("select_0"))
101            .set_initial_user(Some("User0"))
102            .set_confirm(Some(confirm()))
103            .set_focus_on_load(Some(true))
104            .set_placeholder(Some(plain_text("Select item")))
105            .build()
106            .unwrap();
107
108        assert_eq!(val, expected);
109
110        let val = SelectMenuUsers::builder()
111            .action_id("select_0")
112            .initial_user("User0")
113            .confirm(confirm())
114            .focus_on_load(true)
115            .placeholder(plain_text("Select item"))
116            .build()
117            .unwrap();
118
119        assert_eq!(val, expected);
120    }
121
122    #[test]
123    fn it_requires_action_id_less_than_255_characters_long() {
124        let err = SelectMenuUsers::builder()
125            .action_id("a".repeat(256))
126            .build()
127            .unwrap_err();
128        assert_eq!(err.object(), "SelectMenuUsers");
129
130        let errors = err.field("action_id");
131        assert!(errors.includes(ValidationErrorKind::MaxTextLength(255)));
132    }
133
134    #[test]
135    fn it_requires_placeholder_text_less_than_150_characters_long() {
136        let err = SelectMenuUsers::builder()
137            .placeholder(plain_text("a".repeat(151)))
138            .build()
139            .unwrap_err();
140        assert_eq!(err.object(), "SelectMenuUsers");
141
142        let errors = err.field("placeholder");
143        assert!(errors.includes(ValidationErrorKind::MaxTextLength(150)));
144    }
145}