twilight_cache_inmemory/model/
emoji.rs

1use crate::CacheableEmoji;
2use serde::Serialize;
3use twilight_model::{
4    guild::Emoji,
5    id::{
6        marker::{EmojiMarker, RoleMarker, UserMarker},
7        Id,
8    },
9};
10
11/// Represents a cached [`Emoji`].
12///
13/// [`Emoji`]: twilight_model::guild::Emoji
14#[allow(clippy::struct_excessive_bools)]
15#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
16pub struct CachedEmoji {
17    pub(crate) animated: bool,
18    pub(crate) available: bool,
19    pub(crate) id: Id<EmojiMarker>,
20    pub(crate) managed: bool,
21    pub(crate) name: String,
22    pub(crate) require_colons: bool,
23    pub(crate) roles: Vec<Id<RoleMarker>>,
24    pub(crate) user_id: Option<Id<UserMarker>>,
25}
26
27impl CachedEmoji {
28    /// Whether this emoji can be used.
29    ///
30    /// May be false due to loss of Server Boosts.
31    pub const fn available(&self) -> bool {
32        self.available
33    }
34
35    /// Whether the emoji is animated.
36    pub const fn animated(&self) -> bool {
37        self.animated
38    }
39
40    /// ID of the Emoji.
41    pub const fn id(&self) -> Id<EmojiMarker> {
42        self.id
43    }
44
45    /// Whether the emoji is managed.
46    pub const fn managed(&self) -> bool {
47        self.managed
48    }
49
50    /// Name of the Emoji.
51    #[allow(clippy::missing_const_for_fn)]
52    pub fn name(&self) -> &str {
53        &self.name
54    }
55
56    /// Whether the emoji must be wrapped in colons.
57    pub const fn require_colons(&self) -> bool {
58        self.require_colons
59    }
60
61    /// List of roles allowed to use this emoji.
62    #[allow(clippy::missing_const_for_fn)]
63    pub fn roles(&self) -> &[Id<RoleMarker>] {
64        &self.roles
65    }
66
67    /// ID of the user who created the emoji.
68    pub const fn user_id(&self) -> Option<Id<UserMarker>> {
69        self.user_id
70    }
71}
72
73impl From<Emoji> for CachedEmoji {
74    fn from(emoji: Emoji) -> Self {
75        let Emoji {
76            animated,
77            available,
78            id,
79            managed,
80            name,
81            require_colons,
82            roles,
83            user,
84        } = emoji;
85
86        Self {
87            animated,
88            available,
89            id,
90            managed,
91            name,
92            require_colons,
93            roles,
94            user_id: user.map(|user| user.id),
95        }
96    }
97}
98
99impl PartialEq<Emoji> for CachedEmoji {
100    fn eq(&self, other: &Emoji) -> bool {
101        self.id == other.id
102            && self.animated == other.animated
103            && self.managed == other.managed
104            && self.name == other.name
105            && self.require_colons == other.require_colons
106            && self.roles == other.roles
107            && self.user_id == other.user.as_ref().map(|user| user.id)
108            && self.available == other.available
109    }
110}
111
112impl CacheableEmoji for CachedEmoji {}
113
114#[cfg(test)]
115mod tests {
116    use super::CachedEmoji;
117    use serde::Serialize;
118    use static_assertions::{assert_fields, assert_impl_all};
119    use std::fmt::Debug;
120    use twilight_model::{guild::Emoji, id::Id};
121
122    assert_fields!(
123        CachedEmoji: id,
124        animated,
125        name,
126        managed,
127        require_colons,
128        roles,
129        user_id
130    );
131    assert_impl_all!(
132        CachedEmoji: Clone,
133        Debug,
134        Eq,
135        PartialEq,
136        PartialEq<Emoji>,
137        Send,
138        Serialize,
139        Sync
140    );
141
142    #[test]
143    fn eq_emoji() {
144        let emoji = Emoji {
145            id: Id::new(123),
146            animated: true,
147            name: "foo".to_owned(),
148            managed: false,
149            require_colons: true,
150            roles: vec![],
151            user: None,
152            available: true,
153        };
154        let cached = CachedEmoji {
155            id: Id::new(123),
156            animated: true,
157            name: "foo".to_owned(),
158            managed: false,
159            require_colons: true,
160            roles: vec![],
161            user_id: None,
162            available: true,
163        };
164
165        assert_eq!(cached, emoji);
166    }
167}