Skip to main content

slack_messaging/blocks/data_visualization/charts/
pie_chart.rs

1use super::Segment;
2
3use crate::validators::*;
4
5use serde::Serialize;
6use slack_messaging_derive::Builder;
7
8/// [Pie chart block](https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block#pie)
9/// representation.
10///
11/// # Fields and Validations
12///
13/// For more details, see the [official
14/// documentation](https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block#pie).
15///
16/// | Field | Type | Required | Validation |
17/// |-------|------|----------|------------|
18/// | segments | Vec<[Segment]> | Yes | Min 1, Max 6 items |
19///
20/// # Example
21///
22/// ```
23/// use slack_messaging::blocks::data_visualization::charts::{segments, PieChart};
24/// # use std::error::Error;
25///
26/// # fn try_main() -> Result<(), Box<dyn Error>> {
27/// let pie_chart = PieChart::builder()
28///    .segments(segments(vec![
29///        ("Kit Kat", 45),
30///        ("Twix", 28),
31///        ("Crunch", 18),
32///        ("Milky Way", 9),
33///    ])?)
34///    .build()?;
35///
36/// let expected = serde_json::json!({
37///     "type": "pie",
38///     "segments": [
39///         { "label": "Kit Kat", "value": 45 },
40///         { "label": "Twix", "value": 28 },
41///         { "label": "Crunch", "value": 18 },
42///         { "label": "Milky Way", "value": 9 }
43///     ]
44/// });
45///
46/// let json = serde_json::to_value(pie_chart).unwrap();
47///
48/// assert_eq!(json, expected);
49/// #     Ok(())
50/// # }
51/// # fn main() {
52/// #     try_main().unwrap()
53/// # }
54/// ```
55#[derive(Debug, Clone, Serialize, PartialEq, Builder)]
56#[serde(tag = "type", rename = "pie")]
57pub struct PieChart {
58    #[builder(push_item = "segment", validate("required", "list::not_empty", "list::max_item_6"))]
59    pub(crate) segments: Option<Vec<Segment>>,
60}
61
62#[cfg(test)]
63mod tests {
64    use super::*;
65    use super::super::segments;
66    use crate::errors::*;
67
68    #[test]
69    fn it_implements_builder() {
70        let expected = PieChart {
71            segments: Some(segments(vec![
72                ("Segment 1", 10),
73                ("Segment 2", 20),
74            ]).unwrap()),
75        };
76
77        let val = PieChart::builder()
78            .set_segments(Some(segments(vec![
79                ("Segment 1", 10),
80                ("Segment 2", 20),
81            ]).unwrap()))
82            .build()
83            .unwrap();
84
85        assert_eq!(val, expected);
86
87        let val = PieChart::builder()
88            .segments(segments(vec![
89                ("Segment 1", 10),
90                ("Segment 2", 20),
91            ]).unwrap())
92            .build()
93            .unwrap();
94
95        assert_eq!(val, expected);
96    }
97
98    #[test]
99    fn it_implements_push_item_method() {
100        let expected = PieChart {
101            segments: Some(segments(vec![
102                ("Segment 1", 10),
103                ("Segment 2", 20),
104            ]).unwrap()),
105        };
106
107        let val = PieChart::builder()
108            .segment(
109                Segment::builder()
110                    .label("Segment 1")
111                    .value(10)
112                    .build()
113                    .unwrap(),
114            )
115            .segment(
116                Segment::builder()
117                    .label("Segment 2")
118                    .value(20)
119                    .build()
120                    .unwrap(),
121            )
122            .build()
123            .unwrap();
124
125        assert_eq!(val, expected);
126    }
127
128    #[test]
129    fn it_requires_segments_field() {
130        let err = PieChart::builder().build().unwrap_err();
131        assert_eq!(err.object(), "PieChart");
132
133        let errors = err.field("segments");
134        assert!(errors.includes(ValidationErrorKind::Required));
135    }
136
137    #[test]
138    fn it_requires_segments_list_size_more_than_0() {
139        let err = PieChart::builder()
140            .segments(vec![] as Vec<Segment>)
141            .build()
142            .unwrap_err();
143        assert_eq!(err.object(), "PieChart");
144
145        let errors = err.field("segments");
146        assert!(errors.includes(ValidationErrorKind::EmptyArray));
147    }
148
149    #[test]
150    fn it_requires_segments_list_size_less_than_6() {
151        let segs = segments(vec![
152            ("Segment 1", 10),
153            ("Segment 2", 20),
154            ("Segment 3", 30),
155            ("Segment 4", 40),
156            ("Segment 5", 50),
157            ("Segment 6", 60),
158            ("Segment 7", 70),
159        ]).unwrap();
160        let err = PieChart::builder()
161            .segments(segs)
162            .build()
163            .unwrap_err();
164        assert_eq!(err.object(), "PieChart");
165
166        let errors = err.field("segments");
167        assert!(errors.includes(ValidationErrorKind::MaxArraySize(6)));
168    }
169}