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 pub answers: Vec<PollAnswer>,
22 pub allow_multiselect: bool,
24 pub expiry: Option<Timestamp>,
26 pub layout_type: PollLayoutType,
28 pub question: PollMedia,
30 #[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}