use core::fmt::Display;
use async_trait::async_trait;
use twilight_model::{
channel::{ReactionType, StageInstance},
id::{
marker::{
ChannelMarker, EmojiMarker, GenericMarker, GuildMarker, MessageMarker, RoleMarker,
StageMarker, StickerMarker, UserMarker,
},
Id,
},
user::CurrentUser,
};
use crate::{
cache,
model::{
CachedActivity, CachedAttachment, CachedChannel, CachedEmbed, CachedEmbedField,
CachedEmoji, CachedGuild, CachedMember, CachedMessage, CachedMessageSticker,
CachedPresence, CachedReaction, CachedRole, CachedSticker,
},
};
pub trait Error: Display + Send {}
impl<E: Error> From<E> for cache::Error<E> {
fn from(err: E) -> Self {
Self::Backend(err)
}
}
#[async_trait]
pub trait Backend {
type Error: Error;
async fn set_current_user(&self, current_user: CurrentUser) -> Result<(), Self::Error>;
async fn upsert_channel(&self, channel: CachedChannel) -> Result<(), Self::Error>;
async fn delete_channel(&self, channel_id: Id<ChannelMarker>) -> Result<(), Self::Error>;
async fn delete_guild_channels(&self, guild_id: Id<GuildMarker>) -> Result<(), Self::Error>;
async fn upsert_private_channel(
&self,
channel_id: Id<ChannelMarker>,
user_id: Id<UserMarker>,
) -> Result<(), Self::Error>;
async fn upsert_guild(&self, guild: CachedGuild) -> Result<(), Self::Error>;
async fn delete_guild(&self, guild_id: Id<GuildMarker>) -> Result<(), Self::Error>;
async fn upsert_emoji(&self, emoji: CachedEmoji) -> Result<(), Self::Error>;
async fn delete_emoji(&self, emoji_id: Id<EmojiMarker>) -> Result<(), Self::Error>;
async fn delete_guild_emojis(&self, guild_id: Id<GuildMarker>) -> Result<(), Self::Error>;
async fn upsert_sticker(&self, sticker: CachedSticker) -> Result<(), Self::Error>;
async fn delete_sticker(&self, sticker_id: Id<StickerMarker>) -> Result<(), Self::Error>;
async fn delete_guild_stickers(&self, guild_id: Id<GuildMarker>) -> Result<(), Self::Error>;
async fn upsert_member(&self, member: CachedMember) -> Result<(), Self::Error>;
async fn delete_member(
&self,
user_id: Id<UserMarker>,
guild_id: Id<GuildMarker>,
) -> Result<(), Self::Error>;
async fn delete_guild_members(&self, guild_id: Id<GuildMarker>) -> Result<(), Self::Error>;
async fn upsert_message(&self, message: CachedMessage) -> Result<(), Self::Error>;
async fn delete_message(&self, message_id: Id<MessageMarker>) -> Result<(), Self::Error>;
async fn upsert_embed(&self, embed: CachedEmbed) -> Result<(), Self::Error>;
async fn delete_embed(&self, embed_id: Id<GenericMarker>) -> Result<(), Self::Error>;
async fn upsert_embed_field(&self, embed_field: CachedEmbedField) -> Result<(), Self::Error>;
async fn delete_embed_fields(&self, embed_id: Id<GenericMarker>) -> Result<(), Self::Error>;
async fn cached_embeds(
&self,
message_id: Id<MessageMarker>,
) -> Result<Vec<CachedEmbed>, Self::Error>;
async fn embed_fields(
&self,
embed_id: Id<GenericMarker>,
) -> Result<Vec<CachedEmbedField>, Self::Error>;
async fn upsert_attachment(&self, attachment: CachedAttachment) -> Result<(), Self::Error>;
async fn delete_message_attachments(
&self,
message_id: Id<MessageMarker>,
) -> Result<(), Self::Error>;
async fn upsert_message_sticker(
&self,
sticker: CachedMessageSticker,
) -> Result<(), Self::Error>;
async fn delete_message_stickers(
&self,
message_id: Id<MessageMarker>,
) -> Result<(), Self::Error>;
async fn upsert_presence(&self, presence: CachedPresence) -> Result<(), Self::Error>;
async fn delete_presence(&self, user_id: Id<UserMarker>) -> Result<(), Self::Error>;
async fn delete_guild_presences(&self, guild_id: Id<GuildMarker>) -> Result<(), Self::Error>;
async fn upsert_activity(&self, activity: CachedActivity) -> Result<(), Self::Error>;
async fn delete_user_activities(&self, user_id: Id<UserMarker>) -> Result<(), Self::Error>;
async fn upsert_reaction(&self, reaction: CachedReaction) -> Result<(), Self::Error>;
async fn delete_reaction(
&self,
message_id: Id<MessageMarker>,
user_id: Id<UserMarker>,
emoji: ReactionType,
) -> Result<(), Self::Error>;
async fn delete_message_reactions_by_emoji(
&self,
message_id: Id<MessageMarker>,
emoji: ReactionType,
) -> Result<(), Self::Error>;
async fn delete_message_reactions(
&self,
message_id: Id<MessageMarker>,
) -> Result<(), Self::Error>;
async fn upsert_role(&self, role: CachedRole) -> Result<(), Self::Error>;
async fn delete_role(&self, role_id: Id<RoleMarker>) -> Result<(), Self::Error>;
async fn delete_guild_roles(&self, guild_id: Id<GuildMarker>) -> Result<(), Self::Error>;
async fn delete_member_roles(
&self,
guild_id: Id<GuildMarker>,
user_id: Id<UserMarker>,
) -> Result<(), Self::Error>;
async fn upsert_stage_instance(&self, stage: StageInstance) -> Result<(), Self::Error>;
async fn delete_stage_instance(&self, stage_id: Id<StageMarker>) -> Result<(), Self::Error>;
async fn delete_guild_stage_instances(
&self,
guild_id: Id<GuildMarker>,
) -> Result<(), Self::Error>;
}