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}