twilight_model/guild/
emoji.rs

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    // This does not need to be optional here as it can only be optional
18    // in a unicode emoji. Which can only happen in reactions, and we use
19    // another struct for emojis in that case.
20    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}