Skip to main content

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}