twilight_cache_inmemory/model/
emoji.rs1use crate::CacheableEmoji;
2use serde::Serialize;
3use twilight_model::{
4 guild::Emoji,
5 id::{
6 marker::{EmojiMarker, RoleMarker, UserMarker},
7 Id,
8 },
9};
10
11#[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 pub const fn available(&self) -> bool {
32 self.available
33 }
34
35 pub const fn animated(&self) -> bool {
37 self.animated
38 }
39
40 pub const fn id(&self) -> Id<EmojiMarker> {
42 self.id
43 }
44
45 pub const fn managed(&self) -> bool {
47 self.managed
48 }
49
50 #[allow(clippy::missing_const_for_fn)]
52 pub fn name(&self) -> &str {
53 &self.name
54 }
55
56 pub const fn require_colons(&self) -> bool {
58 self.require_colons
59 }
60
61 #[allow(clippy::missing_const_for_fn)]
63 pub fn roles(&self) -> &[Id<RoleMarker>] {
64 &self.roles
65 }
66
67 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}