slack_messaging/message/
builder.rs

1use super::{Block, Message};
2
3impl Message {
4    /// Construct a [`MessageBuilder`].
5    pub fn builder() -> MessageBuilder {
6        MessageBuilder::default()
7    }
8}
9
10/// Builder for [`Message`] object.
11#[derive(Debug, Default)]
12pub struct MessageBuilder {
13    text: Option<String>,
14    blocks: Vec<Block>,
15    thread_ts: Option<String>,
16    mrkdwn: Option<bool>,
17    response_type: Option<String>,
18    replace_original: Option<bool>,
19    delete_original: Option<bool>,
20    reply_broadcast: Option<bool>,
21}
22
23impl MessageBuilder {
24    /// Set text field.
25    ///
26    /// ```
27    /// # use slack_messaging::Message;
28    /// let message = Message::builder()
29    ///     .set_text(Some("New Paid Time Off request from Fred Enriquez".into()))
30    ///     .build();
31    ///
32    /// let expected = serde_json::json!({
33    ///     "text": "New Paid Time Off request from Fred Enriquez",
34    /// });
35    ///
36    /// let json = serde_json::to_value(message).unwrap();
37    ///
38    /// assert_eq!(json, expected);
39    /// ```
40    pub fn set_text(self, text: Option<String>) -> Self {
41        Self { text, ..self }
42    }
43
44    /// Set text field.
45    ///
46    /// ```
47    /// # use slack_messaging::Message;
48    /// let message = Message::builder()
49    ///     .text("New Paid Time Off request from Fred Enriquez")
50    ///     .build();
51    ///
52    /// let expected = serde_json::json!({
53    ///     "text": "New Paid Time Off request from Fred Enriquez",
54    /// });
55    ///
56    /// let json = serde_json::to_value(message).unwrap();
57    ///
58    /// assert_eq!(json, expected);
59    /// ```
60    pub fn text(self, text: impl Into<String>) -> Self {
61        self.set_text(Some(text.into()))
62    }
63
64    /// Set blocks field. The argument is a vector composed from any objects
65    /// that can transform into the enum [Block](crate::blocks::Block).
66    ///
67    /// ```
68    /// # use slack_messaging::{blocks::{Header, Section}, mrkdwn, Message};
69    /// let message = Message::builder()
70    ///     .set_blocks(
71    ///         vec![
72    ///             Header::builder()
73    ///                 .text("New request")
74    ///                 .build()
75    ///                 .into(),
76    ///             Section::builder()
77    ///                 .text(mrkdwn!("<https://example.com|View request>"))
78    ///                 .build()
79    ///                 .into(),
80    ///         ]
81    ///     )
82    ///     .build();
83    ///
84    /// let expected = serde_json::json!({
85    ///     "blocks": [
86    ///         {
87    ///             "type": "header",
88    ///             "text": {
89    ///                 "type": "plain_text",
90    ///                 "text": "New request"
91    ///             }
92    ///         },
93    ///         {
94    ///             "type": "section",
95    ///             "text": {
96    ///                 "type": "mrkdwn",
97    ///                 "text": "<https://example.com|View request>"
98    ///             }
99    ///         }
100    ///     ]
101    /// });
102    ///
103    /// let json = serde_json::to_value(message).unwrap();
104    ///
105    /// assert_eq!(json, expected);
106    /// ```
107    pub fn set_blocks(self, blocks: Vec<Block>) -> Self {
108        Self { blocks, ..self }
109    }
110
111    /// Add an object to blocks field. The argument is an any object
112    /// that can transform into the enum [Block](crate::blocks::Block).
113    ///
114    /// ```
115    /// # use slack_messaging::{blocks::{Header, Section}, mrkdwn, Message};
116    /// let message = Message::builder()
117    ///     .block(
118    ///         Header::builder()
119    ///             .text("New request")
120    ///             .build()
121    ///     )
122    ///     .block(
123    ///         Section::builder()
124    ///             .text(mrkdwn!("<https://example.com|View request>"))
125    ///             .build()
126    ///     )
127    ///     .build();
128    ///
129    /// let expected = serde_json::json!({
130    ///     "blocks": [
131    ///         {
132    ///             "type": "header",
133    ///             "text": {
134    ///                 "type": "plain_text",
135    ///                 "text": "New request"
136    ///             }
137    ///         },
138    ///         {
139    ///             "type": "section",
140    ///             "text": {
141    ///                 "type": "mrkdwn",
142    ///                 "text": "<https://example.com|View request>"
143    ///             }
144    ///         }
145    ///     ]
146    /// });
147    ///
148    /// let json = serde_json::to_value(message).unwrap();
149    ///
150    /// assert_eq!(json, expected);
151    /// ```
152    pub fn block(self, block: impl Into<Block>) -> Self {
153        let Self { mut blocks, .. } = self;
154        blocks.push(block.into());
155        Self { blocks, ..self }
156    }
157
158    /// Set thread_ts field.
159    ///
160    /// ```
161    /// # use slack_messaging::Message;
162    /// let message = Message::builder()
163    ///     .set_thread_ts(Some("some ts value".into()))
164    ///     .build();
165    ///
166    /// let expected = serde_json::json!({
167    ///     "thread_ts": "some ts value",
168    /// });
169    ///
170    /// let json = serde_json::to_value(message).unwrap();
171    ///
172    /// assert_eq!(json, expected);
173    /// ```
174    pub fn set_thread_ts(self, thread_ts: Option<String>) -> Self {
175        Self { thread_ts, ..self }
176    }
177
178    /// Set thread_ts field.
179    ///
180    /// ```
181    /// # use slack_messaging::Message;
182    /// let message = Message::builder()
183    ///     .thread_ts("some ts value")
184    ///     .build();
185    ///
186    /// let expected = serde_json::json!({
187    ///     "thread_ts": "some ts value",
188    /// });
189    ///
190    /// let json = serde_json::to_value(message).unwrap();
191    ///
192    /// assert_eq!(json, expected);
193    /// ```
194    pub fn thread_ts(self, thread_ts: impl Into<String>) -> Self {
195        self.set_thread_ts(Some(thread_ts.into()))
196    }
197
198    /// Set mrkdwn field.
199    ///
200    /// ```
201    /// # use slack_messaging::Message;
202    /// let message = Message::builder()
203    ///     .set_mrkdwn(Some(true))
204    ///     .build();
205    ///
206    /// let expected = serde_json::json!({
207    ///     "mrkdwn": true,
208    /// });
209    ///
210    /// let json = serde_json::to_value(message).unwrap();
211    ///
212    /// assert_eq!(json, expected);
213    /// ```
214    pub fn set_mrkdwn(self, mrkdwn: Option<bool>) -> Self {
215        Self { mrkdwn, ..self }
216    }
217
218    /// Set mrkdwn field.
219    ///
220    /// ```
221    /// # use slack_messaging::Message;
222    /// let message = Message::builder()
223    ///     .mrkdwn(true)
224    ///     .build();
225    ///
226    /// let expected = serde_json::json!({
227    ///     "mrkdwn": true,
228    /// });
229    ///
230    /// let json = serde_json::to_value(message).unwrap();
231    ///
232    /// assert_eq!(json, expected);
233    /// ```
234    pub fn mrkdwn(self, mrkdwn: bool) -> Self {
235        self.set_mrkdwn(Some(mrkdwn))
236    }
237
238    /// Set response_type field.
239    ///
240    /// ```
241    /// # use slack_messaging::Message;
242    /// let message = Message::builder()
243    ///     .set_response_type(Some("in_channel".into()))
244    ///     .build();
245    ///
246    /// let expected = serde_json::json!({
247    ///     "response_type": "in_channel",
248    /// });
249    ///
250    /// let json = serde_json::to_value(message).unwrap();
251    ///
252    /// assert_eq!(json, expected);
253    /// ```
254    pub fn set_response_type(self, response_type: Option<String>) -> Self {
255        Self {
256            response_type,
257            ..self
258        }
259    }
260
261    /// Set response_type field.
262    ///
263    /// ```
264    /// # use slack_messaging::Message;
265    /// let message = Message::builder()
266    ///     .response_type("in_channel")
267    ///     .build();
268    ///
269    /// let expected = serde_json::json!({
270    ///     "response_type": "in_channel",
271    /// });
272    ///
273    /// let json = serde_json::to_value(message).unwrap();
274    ///
275    /// assert_eq!(json, expected);
276    /// ```
277    pub fn response_type(self, response_type: impl Into<String>) -> Self {
278        self.set_response_type(Some(response_type.into()))
279    }
280
281    /// Set replace_original field.
282    ///
283    /// ```
284    /// # use slack_messaging::Message;
285    /// let message = Message::builder()
286    ///     .set_replace_original(Some(true))
287    ///     .build();
288    ///
289    /// let expected = serde_json::json!({
290    ///     "replace_original": true,
291    /// });
292    ///
293    /// let json = serde_json::to_value(message).unwrap();
294    ///
295    /// assert_eq!(json, expected);
296    /// ```
297    pub fn set_replace_original(self, replace_original: Option<bool>) -> Self {
298        Self {
299            replace_original,
300            ..self
301        }
302    }
303
304    /// Set replace_original field.
305    ///
306    /// ```
307    /// # use slack_messaging::Message;
308    /// let message = Message::builder()
309    ///     .replace_original(true)
310    ///     .build();
311    ///
312    /// let expected = serde_json::json!({
313    ///     "replace_original": true,
314    /// });
315    ///
316    /// let json = serde_json::to_value(message).unwrap();
317    ///
318    /// assert_eq!(json, expected);
319    /// ```
320    pub fn replace_original(self, replace_original: bool) -> Self {
321        self.set_replace_original(Some(replace_original))
322    }
323
324    /// Set delete_original field.
325    ///
326    /// ```
327    /// # use slack_messaging::Message;
328    /// let message = Message::builder()
329    ///     .set_delete_original(Some(true))
330    ///     .build();
331    ///
332    /// let expected = serde_json::json!({
333    ///     "delete_original": true,
334    /// });
335    ///
336    /// let json = serde_json::to_value(message).unwrap();
337    ///
338    /// assert_eq!(json, expected);
339    /// ```
340    pub fn set_delete_original(self, delete_original: Option<bool>) -> Self {
341        Self {
342            delete_original,
343            ..self
344        }
345    }
346
347    /// Set delete_original field.
348    ///
349    /// ```
350    /// # use slack_messaging::Message;
351    /// let message = Message::builder()
352    ///     .delete_original(true)
353    ///     .build();
354    ///
355    /// let expected = serde_json::json!({
356    ///     "delete_original": true,
357    /// });
358    ///
359    /// let json = serde_json::to_value(message).unwrap();
360    ///
361    /// assert_eq!(json, expected);
362    /// ```
363    pub fn delete_original(self, delete_original: bool) -> Self {
364        self.set_delete_original(Some(delete_original))
365    }
366
367    /// Set reply_broadcast field.
368    ///
369    /// ```
370    /// # use slack_messaging::Message;
371    /// let message = Message::builder()
372    ///     .set_reply_broadcast(Some(true))
373    ///     .build();
374    /// 
375    /// let expected = serde_json::json!({
376    ///     "reply_broadcast": true,
377    /// });
378    ///
379    /// let json = serde_json::to_value(message).unwrap();
380    ///
381    /// assert_eq!(json, expected);
382    /// ```
383    pub fn set_reply_broadcast(self, reply_broadcast: Option<bool>) -> Self {
384        Self { reply_broadcast, ..self }
385    }
386
387    /// Set reply_broadcast field.
388    ///
389    /// ```
390    /// # use slack_messaging::Message;
391    /// let message = Message::builder()
392    ///     .reply_broadcast(true)
393    ///     .build();
394    ///
395    /// let expected = serde_json::json!({
396    ///     "reply_broadcast": true,
397    /// });
398    ///
399    /// let json = serde_json::to_value(message).unwrap();
400    ///
401    /// assert_eq!(json, expected);
402    /// ```
403    pub fn reply_broadcast(self, reply_broadcast: bool) -> Self {
404        self.set_reply_broadcast(Some(reply_broadcast))
405    }
406
407    /// Build a [`Message`] object.
408    pub fn build(self) -> Message {
409        Message {
410            text: self.text,
411            blocks: self.blocks,
412            thread_ts: self.thread_ts,
413            mrkdwn: self.mrkdwn,
414            response_type: self.response_type,
415            replace_original: self.replace_original,
416            delete_original: self.delete_original,
417            reply_broadcast: self.reply_broadcast,
418        }
419    }
420
421    /// Get text value.
422    pub fn get_text(&self) -> &Option<String> {
423        &self.text
424    }
425
426    /// Get blocks value.
427    pub fn get_blocks(&self) -> &[Block] {
428        &self.blocks
429    }
430
431    /// Get thread_ts value.
432    pub fn get_thread_ts(&self) -> &Option<String> {
433        &self.thread_ts
434    }
435
436    /// Get mrkdwn value.
437    pub fn get_mrkdwn(&self) -> &Option<bool> {
438        &self.mrkdwn
439    }
440
441    /// Get response_type value.
442    pub fn get_response_type(&self) -> &Option<String> {
443        &self.response_type
444    }
445
446    /// Get replace_original value.
447    pub fn get_replace_original(&self) -> &Option<bool> {
448        &self.replace_original
449    }
450
451    /// Get delete_original value.
452    pub fn get_delete_original(&self) -> &Option<bool> {
453        &self.delete_original
454    }
455
456    /// Get reply_broadcast value.
457    pub fn get_reply_broadcast(&self) -> &Option<bool> {
458        &self.reply_broadcast
459    }
460}