revolt_database/models/emojis/ops/
reference.rs1use revolt_result::Result;
2
3use crate::{Emoji, PartialEmoji};
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 update_emoji(&self, emoji_id: &str, partial: &PartialEmoji) -> Result<()> {
59 let mut emojis = self.emojis.lock().await;
60 if let Some(emoji) = emojis.get_mut(emoji_id) {
61 if let Some(name) = partial.name.clone() {
62 emoji.name = name;
63 }
64 Ok(())
65 } else {
66 Err(create_error!(NotFound))
67 }
68 }
69
70 async fn detach_emoji(&self, emoji: &Emoji) -> Result<()> {
72 let mut emojis = self.emojis.lock().await;
73 if let Some(bot) = emojis.get_mut(&emoji.id) {
74 bot.parent = EmojiParent::Detached;
75 Ok(())
76 } else {
77 Err(create_error!(NotFound))
78 }
79 }
80}