1use crate::{
2 id::{
3 marker::{EmojiMarker, RoleMarker},
4 Id,
5 },
6 user::User,
7};
8use serde::{Deserialize, Serialize};
9
10#[allow(clippy::struct_excessive_bools)]
11#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
12pub struct Emoji {
13 #[serde(default)]
14 pub animated: bool,
15 #[serde(default)]
16 pub available: bool,
17 pub id: Id<EmojiMarker>,
21 #[serde(default)]
22 pub managed: bool,
23 pub name: String,
24 #[serde(default)]
25 pub require_colons: bool,
26 #[serde(default, skip_serializing_if = "Vec::is_empty")]
27 pub roles: Vec<Id<RoleMarker>>,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub user: Option<User>,
30}
31
32#[cfg(test)]
33mod tests {
34 use super::{Emoji, User};
35 use crate::id::Id;
36 use serde_test::Token;
37
38 #[test]
39 fn emoji() {
40 let emoji = Emoji {
41 animated: false,
42 available: true,
43 id: Id::new(100_000_000_000_000_000),
44 managed: false,
45 name: "test".to_owned(),
46 require_colons: true,
47 roles: Vec::new(),
48 user: Some(User {
49 accent_color: None,
50 avatar: None,
51 avatar_decoration: None,
52 avatar_decoration_data: None,
53 banner: None,
54 bot: false,
55 discriminator: 1,
56 email: None,
57 flags: None,
58 global_name: Some("test".to_owned()),
59 id: Id::new(1),
60 locale: None,
61 mfa_enabled: None,
62 name: "test".to_owned(),
63 premium_type: None,
64 public_flags: None,
65 system: None,
66 verified: None,
67 }),
68 };
69
70 serde_test::assert_tokens(
71 &emoji,
72 &[
73 Token::Struct {
74 name: "Emoji",
75 len: 7,
76 },
77 Token::Str("animated"),
78 Token::Bool(false),
79 Token::Str("available"),
80 Token::Bool(true),
81 Token::Str("id"),
82 Token::NewtypeStruct { name: "Id" },
83 Token::Str("100000000000000000"),
84 Token::Str("managed"),
85 Token::Bool(false),
86 Token::Str("name"),
87 Token::Str("test"),
88 Token::Str("require_colons"),
89 Token::Bool(true),
90 Token::Str("user"),
91 Token::Some,
92 Token::Struct {
93 name: "User",
94 len: 10,
95 },
96 Token::Str("accent_color"),
97 Token::None,
98 Token::Str("avatar"),
99 Token::None,
100 Token::Str("avatar_decoration"),
101 Token::None,
102 Token::Str("avatar_decoration_data"),
103 Token::None,
104 Token::Str("banner"),
105 Token::None,
106 Token::Str("bot"),
107 Token::Bool(false),
108 Token::Str("discriminator"),
109 Token::Str("0001"),
110 Token::Str("global_name"),
111 Token::Some,
112 Token::Str("test"),
113 Token::Str("id"),
114 Token::NewtypeStruct { name: "Id" },
115 Token::Str("1"),
116 Token::Str("username"),
117 Token::Str("test"),
118 Token::StructEnd,
119 Token::StructEnd,
120 ],
121 )
122 }
123
124 #[test]
125 fn emoji_complete() {
126 let emoji = Emoji {
127 animated: false,
128 available: true,
129 id: Id::new(100_000_000_000_000_000),
130 managed: false,
131 name: "test".to_owned(),
132 require_colons: true,
133 roles: vec![Id::new(1)],
134 user: Some(User {
135 accent_color: None,
136 avatar: None,
137 avatar_decoration: None,
138 avatar_decoration_data: None,
139 banner: None,
140 bot: false,
141 discriminator: 1,
142 email: None,
143 flags: None,
144 global_name: Some("test".to_owned()),
145 id: Id::new(1),
146 locale: None,
147 mfa_enabled: None,
148 name: "test".to_owned(),
149 premium_type: None,
150 public_flags: None,
151 system: None,
152 verified: None,
153 }),
154 };
155
156 serde_test::assert_tokens(
157 &emoji,
158 &[
159 Token::Struct {
160 name: "Emoji",
161 len: 8,
162 },
163 Token::Str("animated"),
164 Token::Bool(false),
165 Token::Str("available"),
166 Token::Bool(true),
167 Token::Str("id"),
168 Token::NewtypeStruct { name: "Id" },
169 Token::Str("100000000000000000"),
170 Token::Str("managed"),
171 Token::Bool(false),
172 Token::Str("name"),
173 Token::Str("test"),
174 Token::Str("require_colons"),
175 Token::Bool(true),
176 Token::Str("roles"),
177 Token::Seq { len: Some(1) },
178 Token::NewtypeStruct { name: "Id" },
179 Token::Str("1"),
180 Token::SeqEnd,
181 Token::Str("user"),
182 Token::Some,
183 Token::Struct {
184 name: "User",
185 len: 10,
186 },
187 Token::Str("accent_color"),
188 Token::None,
189 Token::Str("avatar"),
190 Token::None,
191 Token::Str("avatar_decoration"),
192 Token::None,
193 Token::Str("avatar_decoration_data"),
194 Token::None,
195 Token::Str("banner"),
196 Token::None,
197 Token::Str("bot"),
198 Token::Bool(false),
199 Token::Str("discriminator"),
200 Token::Str("0001"),
201 Token::Str("global_name"),
202 Token::Some,
203 Token::Str("test"),
204 Token::Str("id"),
205 Token::NewtypeStruct { name: "Id" },
206 Token::Str("1"),
207 Token::Str("username"),
208 Token::Str("test"),
209 Token::StructEnd,
210 Token::StructEnd,
211 ],
212 )
213 }
214}