revolt_database/models/emojis/ops/
reference.rs

1use 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    /// Insert emoji into database.
12    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    /// Fetch an emoji by its id
23    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    /// Fetch emoji by their parent id
32    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    /// Fetch emoji by their parent ids
45    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    /// Detach an emoji by its id
58    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}