slack_messaging/blocks/elements/url_source.rs
1use crate::validators::*;
2
3use serde::Serialize;
4use slack_messaging_derive::Builder;
5
6/// [URL source
7/// element](https://docs.slack.dev/reference/block-kit/block-elements/url-source-element)
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/url-source-element).
14///
15/// | Field | Type | Required | Validation |
16/// |-------|------|----------|------------|
17/// | url | String | Yes | N/A |
18/// | text | String | Yes | N/A |
19///
20/// # Example
21///
22/// ```
23/// use slack_messaging::blocks::elements::UrlSource;
24/// # use std::error::Error;
25///
26/// # fn try_main() -> Result<(), Box<dyn Error>> {
27/// let url_source = UrlSource::builder()
28/// .url("https://docs.slack.dev/")
29/// .text("Slack API docs")
30/// .build()?;
31///
32/// let expected = serde_json::json!({
33/// "type": "url",
34/// "url": "https://docs.slack.dev/",
35/// "text": "Slack API docs"
36/// });
37///
38/// let json = serde_json::to_value(url_source).unwrap();
39///
40/// assert_eq!(json, expected);
41///
42/// // If your object has any validation errors, the build method returns Result::Err
43/// let url_source = UrlSource::builder().build();
44///
45/// assert!(url_source.is_err());
46/// # Ok(())
47/// # }
48/// # fn main() {
49/// # try_main().unwrap()
50/// # }
51/// ```
52#[derive(Debug, Clone, Serialize, PartialEq, Builder)]
53#[serde(tag = "type", rename = "url")]
54pub struct UrlSource {
55 #[builder(validate("required"))]
56 pub(crate) url: Option<String>,
57
58 #[builder(validate("required"))]
59 pub(crate) text: Option<String>,
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65 use crate::errors::*;
66
67 #[test]
68 fn it_implements_builder() {
69 let expected = UrlSource {
70 url: Some("https://docs.slack.dev/".into()),
71 text: Some("Slack API docs".into()),
72 };
73
74 let val = UrlSource::builder()
75 .set_url(Some("https://docs.slack.dev/"))
76 .set_text(Some("Slack API docs"))
77 .build()
78 .unwrap();
79
80 assert_eq!(val, expected);
81
82 let val = UrlSource::builder()
83 .url("https://docs.slack.dev/")
84 .text("Slack API docs")
85 .build()
86 .unwrap();
87
88 assert_eq!(val, expected);
89 }
90
91 #[test]
92 fn it_requires_url_field() {
93 let err = UrlSource::builder()
94 .text("Slack API docs")
95 .build()
96 .unwrap_err();
97 assert_eq!(err.object(), "UrlSource");
98
99 let errors = err.field("url");
100 assert!(errors.includes(ValidationErrorKind::Required));
101 }
102
103 #[test]
104 fn it_requires_text_field() {
105 let err = UrlSource::builder()
106 .url("https://docs.slack.dev/")
107 .build()
108 .unwrap_err();
109 assert_eq!(err.object(), "UrlSource");
110
111 let errors = err.field("text");
112 assert!(errors.includes(ValidationErrorKind::Required));
113 }
114}