slack_messaging/blocks/elements/
datetime_picker.rs1use crate::composition_objects::ConfirmationDialog;
2use crate::validators::*;
3
4use serde::Serialize;
5use slack_messaging_derive::Builder;
6
7#[derive(Debug, Clone, Serialize, PartialEq, Builder)]
58#[serde(tag = "type", rename = "datetimepicker")]
59pub struct DatetimePicker {
60 #[serde(skip_serializing_if = "Option::is_none")]
61 #[builder(validate("text::max_255"))]
62 pub(crate) action_id: Option<String>,
63
64 #[serde(skip_serializing_if = "Option::is_none")]
65 #[builder(validate("integer::ten_digits"))]
66 pub(crate) initial_date_time: Option<i64>,
67
68 #[serde(skip_serializing_if = "Option::is_none")]
69 pub(crate) confirm: Option<ConfirmationDialog>,
70
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub(crate) focus_on_load: Option<bool>,
73}
74
75#[cfg(test)]
76mod tests {
77 use super::*;
78 use crate::composition_objects::test_helpers::*;
79 use crate::errors::*;
80
81 #[test]
82 fn it_implements_builder() {
83 let expected = DatetimePicker {
84 action_id: Some("datetimepicker_0".into()),
85 initial_date_time: Some(1628633820),
86 confirm: Some(confirm()),
87 focus_on_load: Some(true),
88 };
89
90 let val = DatetimePicker::builder()
91 .set_action_id(Some("datetimepicker_0"))
92 .set_initial_date_time(Some(1628633820))
93 .set_confirm(Some(confirm()))
94 .set_focus_on_load(Some(true))
95 .build()
96 .unwrap();
97
98 assert_eq!(val, expected);
99
100 let val = DatetimePicker::builder()
101 .action_id("datetimepicker_0")
102 .initial_date_time(1628633820)
103 .confirm(confirm())
104 .focus_on_load(true)
105 .build()
106 .unwrap();
107
108 assert_eq!(val, expected);
109 }
110
111 #[test]
112 fn it_requires_action_id_less_than_255_characters_long() {
113 let err = DatetimePicker::builder()
114 .action_id("a".repeat(256))
115 .build()
116 .unwrap_err();
117 assert_eq!(err.object(), "DatetimePicker");
118
119 let errors = err.field("action_id");
120 assert!(errors.includes(ValidationErrorKind::MaxTextLength(255)));
121 }
122
123 #[test]
124 fn it_requires_initial_date_time_matches_10_digits_format() {
125 let err = DatetimePicker::builder()
126 .initial_date_time(100000)
127 .build()
128 .unwrap_err();
129 assert_eq!(err.object(), "DatetimePicker");
130
131 let errors = err.field("initial_date_time");
132 assert!(errors.includes(ValidationErrorKind::InvalidFormat("10 digits")));
133 }
134}