1use crate::{
2 id::{
3 Id,
4 marker::{EmojiMarker, RoleMarker},
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 primary_guild: None,
65 public_flags: None,
66 system: None,
67 verified: None,
68 }),
69 };
70
71 serde_test::assert_tokens(
72 &emoji,
73 &[
74 Token::Struct {
75 name: "Emoji",
76 len: 7,
77 },
78 Token::Str("animated"),
79 Token::Bool(false),
80 Token::Str("available"),
81 Token::Bool(true),
82 Token::Str("id"),
83 Token::NewtypeStruct { name: "Id" },
84 Token::Str("100000000000000000"),
85 Token::Str("managed"),
86 Token::Bool(false),
87 Token::Str("name"),
88 Token::Str("test"),
89 Token::Str("require_colons"),
90 Token::Bool(true),
91 Token::Str("user"),
92 Token::Some,
93 Token::Struct {
94 name: "User",
95 len: 10,
96 },
97 Token::Str("accent_color"),
98 Token::None,
99 Token::Str("avatar"),
100 Token::None,
101 Token::Str("avatar_decoration"),
102 Token::None,
103 Token::Str("avatar_decoration_data"),
104 Token::None,
105 Token::Str("banner"),
106 Token::None,
107 Token::Str("bot"),
108 Token::Bool(false),
109 Token::Str("discriminator"),
110 Token::Str("0001"),
111 Token::Str("global_name"),
112 Token::Some,
113 Token::Str("test"),
114 Token::Str("id"),
115 Token::NewtypeStruct { name: "Id" },
116 Token::Str("1"),
117 Token::Str("username"),
118 Token::Str("test"),
119 Token::StructEnd,
120 Token::StructEnd,
121 ],
122 )
123 }
124
125 #[test]
126 fn emoji_complete() {
127 let emoji = Emoji {
128 animated: false,
129 available: true,
130 id: Id::new(100_000_000_000_000_000),
131 managed: false,
132 name: "test".to_owned(),
133 require_colons: true,
134 roles: vec![Id::new(1)],
135 user: Some(User {
136 accent_color: None,
137 avatar: None,
138 avatar_decoration: None,
139 avatar_decoration_data: None,
140 banner: None,
141 bot: false,
142 discriminator: 1,
143 email: None,
144 flags: None,
145 global_name: Some("test".to_owned()),
146 id: Id::new(1),
147 locale: None,
148 mfa_enabled: None,
149 name: "test".to_owned(),
150 premium_type: None,
151 primary_guild: None,
152 public_flags: None,
153 system: None,
154 verified: None,
155 }),
156 };
157
158 serde_test::assert_tokens(
159 &emoji,
160 &[
161 Token::Struct {
162 name: "Emoji",
163 len: 8,
164 },
165 Token::Str("animated"),
166 Token::Bool(false),
167 Token::Str("available"),
168 Token::Bool(true),
169 Token::Str("id"),
170 Token::NewtypeStruct { name: "Id" },
171 Token::Str("100000000000000000"),
172 Token::Str("managed"),
173 Token::Bool(false),
174 Token::Str("name"),
175 Token::Str("test"),
176 Token::Str("require_colons"),
177 Token::Bool(true),
178 Token::Str("roles"),
179 Token::Seq { len: Some(1) },
180 Token::NewtypeStruct { name: "Id" },
181 Token::Str("1"),
182 Token::SeqEnd,
183 Token::Str("user"),
184 Token::Some,
185 Token::Struct {
186 name: "User",
187 len: 10,
188 },
189 Token::Str("accent_color"),
190 Token::None,
191 Token::Str("avatar"),
192 Token::None,
193 Token::Str("avatar_decoration"),
194 Token::None,
195 Token::Str("avatar_decoration_data"),
196 Token::None,
197 Token::Str("banner"),
198 Token::None,
199 Token::Str("bot"),
200 Token::Bool(false),
201 Token::Str("discriminator"),
202 Token::Str("0001"),
203 Token::Str("global_name"),
204 Token::Some,
205 Token::Str("test"),
206 Token::Str("id"),
207 Token::NewtypeStruct { name: "Id" },
208 Token::Str("1"),
209 Token::Str("username"),
210 Token::Str("test"),
211 Token::StructEnd,
212 Token::StructEnd,
213 ],
214 )
215 }
216}