slack_messaging/composition_objects/trigger.rs
1use crate::composition_objects::types::InputParameter;
2use crate::validators::required;
3
4use serde::Serialize;
5use slack_messaging_derive::Builder;
6
7/// [Trigger object](https://docs.slack.dev/reference/block-kit/composition-objects/trigger-object)
8/// representation.
9///
10/// # Fields and Validations
11///
12/// For more details, see the [official
13/// documentation](https://docs.slack.dev/reference/block-kit/composition-objects/trigger-object).
14///
15/// | Field | Type | Required | Validation |
16/// |-------|------|----------|------------|
17/// | url | String | Yes | N/A |
18/// | customizable_input_parameters | Vec<[InputParameter]> | No | N/A |
19///
20/// # Example
21///
22/// ```
23/// use slack_messaging::composition_objects::{types::InputParameter, Trigger};
24/// # use std::error::Error;
25///
26/// # fn try_main() -> Result<(), Box<dyn Error>> {
27/// let trigger = Trigger::builder()
28/// .url("https://slack.com/shortcuts/Ft0123ABC456/123...xyz")
29/// .customizable_input_parameter(
30/// InputParameter::builder()
31/// .name("input_parameter_a")
32/// .value("Value for input param A")
33/// .build()?
34/// )
35/// .customizable_input_parameter(
36/// InputParameter::builder()
37/// .name("input_parameter_b")
38/// .value("Value for input param B")
39/// .build()?
40/// )
41/// .build()?;
42///
43/// let expected = serde_json::json!({
44/// "url": "https://slack.com/shortcuts/Ft0123ABC456/123...xyz",
45/// "customizable_input_parameters": [
46/// {
47/// "name": "input_parameter_a",
48/// "value": "Value for input param A"
49/// },
50/// {
51/// "name": "input_parameter_b",
52/// "value": "Value for input param B"
53/// }
54/// ]
55/// });
56///
57/// let json = serde_json::to_value(trigger).unwrap();
58///
59/// assert_eq!(json, expected);
60///
61/// // If your object has any validation errors, the build method returns Result::Err
62/// let trigger = Trigger::builder()
63/// .customizable_input_parameter(
64/// InputParameter::builder()
65/// .name("input_parameter_a")
66/// .value("Value for input param A")
67/// .build()?
68/// )
69/// .build();
70///
71/// assert!(trigger.is_err());
72/// # Ok(())
73/// # }
74/// # fn main() {
75/// # try_main().unwrap()
76/// # }
77/// ```
78#[derive(Debug, Clone, Serialize, PartialEq, Builder)]
79pub struct Trigger {
80 #[builder(validate("required"))]
81 pub(crate) url: Option<String>,
82
83 #[serde(skip_serializing_if = "Option::is_none")]
84 #[builder(push_item = "customizable_input_parameter")]
85 pub(crate) customizable_input_parameters: Option<Vec<InputParameter>>,
86}
87
88#[cfg(test)]
89mod tests {
90 use super::*;
91 use crate::composition_objects::test_helpers::*;
92 use crate::errors::*;
93
94 #[test]
95 fn it_implements_builder() {
96 let expected = Trigger {
97 url: Some("https://slack.com/shortcuts/Ft0123ABC456/123...xyz".into()),
98 customizable_input_parameters: Some(vec![
99 input_param("param_0", "value_0"),
100 input_param("param_1", "value_1"),
101 ]),
102 };
103
104 let val = Trigger::builder()
105 .set_url(Some("https://slack.com/shortcuts/Ft0123ABC456/123...xyz"))
106 .set_customizable_input_parameters(Some(vec![
107 input_param("param_0", "value_0"),
108 input_param("param_1", "value_1"),
109 ]))
110 .build()
111 .unwrap();
112
113 assert_eq!(val, expected);
114
115 let val = Trigger::builder()
116 .url("https://slack.com/shortcuts/Ft0123ABC456/123...xyz")
117 .customizable_input_parameters(vec![
118 input_param("param_0", "value_0"),
119 input_param("param_1", "value_1"),
120 ])
121 .build()
122 .unwrap();
123
124 assert_eq!(val, expected);
125 }
126
127 #[test]
128 fn it_implements_push_item_method() {
129 let expected = Trigger {
130 url: Some("https://slack.com/shortcuts/Ft0123ABC456/123...xyz".into()),
131 customizable_input_parameters: Some(vec![
132 input_param("param_0", "value_0"),
133 input_param("param_1", "value_1"),
134 ]),
135 };
136
137 let val = Trigger::builder()
138 .url("https://slack.com/shortcuts/Ft0123ABC456/123...xyz")
139 .customizable_input_parameter(input_param("param_0", "value_0"))
140 .customizable_input_parameter(input_param("param_1", "value_1"))
141 .build()
142 .unwrap();
143
144 assert_eq!(val, expected);
145 }
146
147 #[test]
148 fn it_requires_url_field() {
149 let err = Trigger::builder()
150 .customizable_input_parameter(input_param("param_0", "value_0"))
151 .build()
152 .unwrap_err();
153 assert_eq!(err.object(), "Trigger");
154
155 let errors = err.field("url");
156 assert!(errors.includes(ValidationErrorKind::Required));
157 }
158}