use super::session::Session;
use crate::models::gateway::events::*;
use std::{default::Default, error::Error};
use async_std::sync::Arc;
use futures::future::BoxFuture;
pub(crate) type EventResult = Result<(), Box<dyn Error>>;
macro_rules! event_trait {
($event: tt) => {
dyn Fn(Arc<Session>, $event) -> BoxFuture<'static, EventResult> + Send + Sync
};
}
type ReadyFn = event_trait!(Ready);
type ChannelCreateFn = event_trait!(ChannelCreate);
type ChannelUpdateFn = event_trait!(ChannelUpdate);
type ChannelDeleteFn = event_trait!(ChannelDelete);
type ChannelPinsUpdateFn = event_trait!(ChannelPinsUpdate);
type GuildCreateFn = event_trait!(GuildCreate);
type GuildUpdateFn = event_trait!(GuildUpdate);
type GuildDeleteFn = event_trait!(GuildDelete);
type GuildBanAddFn = event_trait!(GuildBanAdd);
type GuildBanRemoveFn = event_trait!(GuildBanRemove);
type GuildEmojisUpdateFn = event_trait!(GuildEmojisUpdate);
type GuildIntegrationsUpdateFn = event_trait!(GuildIntegrationsUpdate);
type GuildMemberAddFn = event_trait!(GuildMemberAdd);
type GuildMemberUpdateFn = event_trait!(GuildMemberUpdate);
type GuildMemberRemoveFn = event_trait!(GuildMemberRemove);
type GuildMembersChunkFn = event_trait!(GuildMembersChunk);
type GuildRoleCreateFn = event_trait!(GuildRoleCreate);
type GuildRoleUpdateFn = event_trait!(GuildRoleUpdate);
type GuildRoleDeleteFn = event_trait!(GuildRoleDelete);
type MessageCreateFn = event_trait!(MessageCreate);
type MessageUpdateFn = event_trait!(MessageUpdate);
type MessageDeleteFn = event_trait!(MessageDelete);
type MessageDeleteBulkFn = event_trait!(MessageDeleteBulk);
type MessageReactionAddFn = event_trait!(MessageReactionAdd);
type MessageReactionRemoveFn = event_trait!(MessageReactionRemove);
type MessageReactionRemoveAllFn = event_trait!(MessageReactionRemoveAll);
type MessageReactionRemoveEmojiFn = event_trait!(MessageReactionRemoveEmoji);
type PresenceUpdateFn = event_trait!(PresenceUpdate);
type TypingStartFn = event_trait!(TypingStart);
type UserUpdateFn = event_trait!(UserUpdate);
type OptionBox<T> = Option<Box<T>>;
#[derive(Default)]
pub(crate) struct EventHandler {
pub(crate) ready: OptionBox<ReadyFn>,
pub(crate) channel_create: OptionBox<ChannelCreateFn>,
pub(crate) channel_update: OptionBox<ChannelUpdateFn>,
pub(crate) channel_delete: OptionBox<ChannelDeleteFn>,
pub(crate) channel_pins_update: OptionBox<ChannelPinsUpdateFn>,
pub(crate) guild_create: OptionBox<GuildCreateFn>,
pub(crate) guild_update: OptionBox<GuildUpdateFn>,
pub(crate) guild_delete: OptionBox<GuildDeleteFn>,
pub(crate) guild_ban_add: OptionBox<GuildBanAddFn>,
pub(crate) guild_ban_remove: OptionBox<GuildBanRemoveFn>,
pub(crate) guild_emojis_update: OptionBox<GuildEmojisUpdateFn>,
pub(crate) guild_integrations_update: OptionBox<GuildIntegrationsUpdateFn>,
pub(crate) guild_member_add: OptionBox<GuildMemberAddFn>,
pub(crate) guild_member_remove: OptionBox<GuildMemberRemoveFn>,
pub(crate) guild_member_update: OptionBox<GuildMemberUpdateFn>,
pub(crate) guild_members_chunk: OptionBox<GuildMembersChunkFn>,
pub(crate) guild_role_create: OptionBox<GuildRoleCreateFn>,
pub(crate) guild_role_update: OptionBox<GuildRoleUpdateFn>,
pub(crate) guild_role_delete: OptionBox<GuildRoleDeleteFn>,
pub(crate) message_create: OptionBox<MessageCreateFn>,
pub(crate) message_update: OptionBox<MessageUpdateFn>,
pub(crate) message_delete: OptionBox<MessageDeleteFn>,
pub(crate) message_delete_bulk: OptionBox<MessageDeleteBulkFn>,
pub(crate) message_reaction_add: OptionBox<MessageReactionAddFn>,
pub(crate) message_reaction_remove: OptionBox<MessageReactionRemoveFn>,
pub(crate) message_reaction_remove_all: OptionBox<MessageReactionRemoveAllFn>,
pub(crate) message_reaction_remove_emoji: OptionBox<MessageReactionRemoveEmojiFn>,
pub(crate) presence_update: OptionBox<PresenceUpdateFn>,
pub(crate) typing_start: OptionBox<TypingStartFn>,
pub(crate) user_update: OptionBox<UserUpdateFn>,
}
impl EventHandler {
pub(crate) fn new() -> Self {
Self::default()
}
}