twilight_model/poll/
mod.rs

1mod answer;
2mod answer_count;
3mod layout_type;
4mod media;
5mod results;
6
7use crate::util::Timestamp;
8use serde::{Deserialize, Serialize};
9
10pub use self::{
11    answer::PollAnswer,
12    answer_count::AnswerCount,
13    layout_type::PollLayoutType,
14    media::{PartialPollMediaEmoji, PollMedia},
15    results::PollResults,
16};
17
18#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
19pub struct Poll {
20    /// Each of the answers available in the poll.
21    pub answers: Vec<PollAnswer>,
22    /// Whether a user can select multiple answers.
23    pub allow_multiselect: bool,
24    /// The time when the poll ends.
25    pub expiry: Option<Timestamp>,
26    /// The layout type of the poll.
27    pub layout_type: PollLayoutType,
28    /// The question of the poll. Only text is supported.
29    pub question: PollMedia,
30    /// The results of the poll.
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub results: Option<PollResults>,
33}
34
35#[cfg(test)]
36mod tests {
37    use super::{AnswerCount, Poll, PollAnswer, PollLayoutType, PollMedia, PollResults};
38    use crate::{id::Id, poll::media::PartialPollMediaEmoji};
39    use serde_test::Token;
40
41    #[test]
42    #[allow(clippy::too_many_lines)]
43    fn poll() {
44        let value = Poll {
45            answers: vec![
46                PollAnswer {
47                    answer_id: 1,
48                    poll_media: PollMedia {
49                        emoji: Some(PartialPollMediaEmoji {
50                            animated: true,
51                            id: Some(Id::new(1)),
52                            name: Some("a".to_owned()),
53                        }),
54                        text: Some("b".to_owned()),
55                    },
56                },
57                PollAnswer {
58                    answer_id: 2,
59                    poll_media: PollMedia {
60                        emoji: Some(PartialPollMediaEmoji {
61                            animated: false,
62                            id: Some(Id::new(3)),
63                            name: Some("c".to_owned()),
64                        }),
65                        text: Some("d".to_owned()),
66                    },
67                },
68            ],
69            allow_multiselect: true,
70            expiry: None,
71            layout_type: PollLayoutType::Default,
72            question: PollMedia {
73                emoji: None,
74                text: Some("e".to_owned()),
75            },
76            results: Some(PollResults {
77                answer_counts: vec![
78                    AnswerCount {
79                        id: 1,
80                        count: 2,
81                        me_voted: true,
82                    },
83                    AnswerCount {
84                        id: 3,
85                        count: 4,
86                        me_voted: false,
87                    },
88                ],
89                is_finalized: true,
90            }),
91        };
92
93        serde_test::assert_tokens(
94            &value,
95            &[
96                Token::Struct {
97                    name: "Poll",
98                    len: 6,
99                },
100                Token::Str("answers"),
101                Token::Seq { len: Some(2) },
102                Token::Struct {
103                    name: "PollAnswer",
104                    len: 2,
105                },
106                Token::Str("answer_id"),
107                Token::U8(1),
108                Token::Str("poll_media"),
109                Token::Struct {
110                    name: "PollMedia",
111                    len: 2,
112                },
113                Token::Str("emoji"),
114                Token::Some,
115                Token::Struct {
116                    name: "PartialPollMediaEmoji",
117                    len: 3,
118                },
119                Token::Str("animated"),
120                Token::Bool(true),
121                Token::Str("id"),
122                Token::Some,
123                Token::NewtypeStruct { name: "Id" },
124                Token::Str("1"),
125                Token::Str("name"),
126                Token::Some,
127                Token::Str("a"),
128                Token::StructEnd,
129                Token::Str("text"),
130                Token::Some,
131                Token::Str("b"),
132                Token::StructEnd,
133                Token::StructEnd,
134                Token::Struct {
135                    name: "PollAnswer",
136                    len: 2,
137                },
138                Token::Str("answer_id"),
139                Token::U8(2),
140                Token::Str("poll_media"),
141                Token::Struct {
142                    name: "PollMedia",
143                    len: 2,
144                },
145                Token::Str("emoji"),
146                Token::Some,
147                Token::Struct {
148                    name: "PartialPollMediaEmoji",
149                    len: 3,
150                },
151                Token::Str("animated"),
152                Token::Bool(false),
153                Token::Str("id"),
154                Token::Some,
155                Token::NewtypeStruct { name: "Id" },
156                Token::Str("3"),
157                Token::Str("name"),
158                Token::Some,
159                Token::Str("c"),
160                Token::StructEnd,
161                Token::Str("text"),
162                Token::Some,
163                Token::Str("d"),
164                Token::StructEnd,
165                Token::StructEnd,
166                Token::SeqEnd,
167                Token::Str("allow_multiselect"),
168                Token::Bool(true),
169                Token::Str("expiry"),
170                Token::None,
171                Token::Str("layout_type"),
172                Token::U8(1),
173                Token::Str("question"),
174                Token::Struct {
175                    name: "PollMedia",
176                    len: 1,
177                },
178                Token::Str("text"),
179                Token::Some,
180                Token::Str("e"),
181                Token::StructEnd,
182                Token::Str("results"),
183                Token::Some,
184                Token::Struct {
185                    name: "PollResults",
186                    len: 2,
187                },
188                Token::Str("answer_counts"),
189                Token::Seq { len: Some(2) },
190                Token::Struct {
191                    name: "AnswerCount",
192                    len: 3,
193                },
194                Token::Str("id"),
195                Token::U8(1),
196                Token::Str("count"),
197                Token::U64(2),
198                Token::Str("me_voted"),
199                Token::Bool(true),
200                Token::StructEnd,
201                Token::Struct {
202                    name: "AnswerCount",
203                    len: 3,
204                },
205                Token::Str("id"),
206                Token::U8(3),
207                Token::Str("count"),
208                Token::U64(4),
209                Token::Str("me_voted"),
210                Token::Bool(false),
211                Token::StructEnd,
212                Token::SeqEnd,
213                Token::Str("is_finalized"),
214                Token::Bool(true),
215                Token::StructEnd,
216                Token::StructEnd,
217            ],
218        );
219    }
220}