twilight_model/guild/
emoji.rs

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    // 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                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}