1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use revolt_result::Result;

use crate::Emoji;
use crate::EmojiParent;
use crate::ReferenceDb;

use super::AbstractEmojis;

#[async_trait]
impl AbstractEmojis for ReferenceDb {
    /// Insert emoji into database.
    async fn insert_emoji(&self, emoji: &Emoji) -> Result<()> {
        let mut emojis = self.emojis.lock().await;
        if emojis.contains_key(&emoji.id) {
            Err(create_database_error!("insert", "emoji"))
        } else {
            emojis.insert(emoji.id.to_string(), emoji.clone());
            Ok(())
        }
    }

    /// Fetch an emoji by its id
    async fn fetch_emoji(&self, id: &str) -> Result<Emoji> {
        let emojis = self.emojis.lock().await;
        emojis
            .get(id)
            .cloned()
            .ok_or_else(|| create_error!(NotFound))
    }

    /// Fetch emoji by their parent id
    async fn fetch_emoji_by_parent_id(&self, parent_id: &str) -> Result<Vec<Emoji>> {
        let emojis = self.emojis.lock().await;
        Ok(emojis
            .values()
            .filter(|emoji| match &emoji.parent {
                EmojiParent::Server { id } => id == parent_id,
                _ => false,
            })
            .cloned()
            .collect())
    }

    /// Fetch emoji by their parent ids
    async fn fetch_emoji_by_parent_ids(&self, parent_ids: &[String]) -> Result<Vec<Emoji>> {
        let emojis = self.emojis.lock().await;
        Ok(emojis
            .values()
            .filter(|emoji| match &emoji.parent {
                EmojiParent::Server { id } => parent_ids.contains(id),
                _ => false,
            })
            .cloned()
            .collect())
    }

    /// Detach an emoji by its id
    async fn detach_emoji(&self, emoji: &Emoji) -> Result<()> {
        let mut emojis = self.emojis.lock().await;
        if let Some(bot) = emojis.get_mut(&emoji.id) {
            bot.parent = EmojiParent::Detached;
            Ok(())
        } else {
            Err(create_error!(NotFound))
        }
    }
}