revolt_database/models/emojis/ops/
reference.rs1use revolt_result::Result;
2
3use crate::Emoji;
4use crate::EmojiParent;
5use crate::ReferenceDb;
6
7use super::AbstractEmojis;
8
9#[async_trait]
10impl AbstractEmojis for ReferenceDb {
11 async fn insert_emoji(&self, emoji: &Emoji) -> Result<()> {
13 let mut emojis = self.emojis.lock().await;
14 if emojis.contains_key(&emoji.id) {
15 Err(create_database_error!("insert", "emoji"))
16 } else {
17 emojis.insert(emoji.id.to_string(), emoji.clone());
18 Ok(())
19 }
20 }
21
22 async fn fetch_emoji(&self, id: &str) -> Result<Emoji> {
24 let emojis = self.emojis.lock().await;
25 emojis
26 .get(id)
27 .cloned()
28 .ok_or_else(|| create_error!(NotFound))
29 }
30
31 async fn fetch_emoji_by_parent_id(&self, parent_id: &str) -> Result<Vec<Emoji>> {
33 let emojis = self.emojis.lock().await;
34 Ok(emojis
35 .values()
36 .filter(|emoji| match &emoji.parent {
37 EmojiParent::Server { id } => id == parent_id,
38 _ => false,
39 })
40 .cloned()
41 .collect())
42 }
43
44 async fn fetch_emoji_by_parent_ids(&self, parent_ids: &[String]) -> Result<Vec<Emoji>> {
46 let emojis = self.emojis.lock().await;
47 Ok(emojis
48 .values()
49 .filter(|emoji| match &emoji.parent {
50 EmojiParent::Server { id } => parent_ids.contains(id),
51 _ => false,
52 })
53 .cloned()
54 .collect())
55 }
56
57 async fn detach_emoji(&self, emoji: &Emoji) -> Result<()> {
59 let mut emojis = self.emojis.lock().await;
60 if let Some(bot) = emojis.get_mut(&emoji.id) {
61 bot.parent = EmojiParent::Detached;
62 Ok(())
63 } else {
64 Err(create_error!(NotFound))
65 }
66 }
67}