use std::{fmt::Display, str::FromStr};
use super::payloads::{
BotMessageStampsUpdatedPayload, ChannelCreatedPayload, ChannelTopicChangedPayload,
DirectMessageCreatedPayload, DirectMessageDeletedPayload, DirectMessageUpdatedPayload,
JoinedPayload, LeftPayload, MessageCreatedPayload, MessageDeletedPayload,
MessageUpdatedPayload, PingPayload, StampCreatedPayload, TagAddedPayload, TagRemovedPayload,
UserCreatedPayload, UserGroupAdminAddedPayload, UserGroupAdminRemovedPayload,
UserGroupCreatedPayload, UserGroupDeletedPayload, UserGroupMemberAddedPayload,
UserGroupMemberRemovedPayload, UserGroupMemberUpdatedPayload, UserGroupUpdatedPayload,
};
use crate::macros::event_converts;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum Event {
Ping(PingPayload),
Joined(JoinedPayload),
Left(LeftPayload),
MessageCreated(MessageCreatedPayload),
MessageDeleted(MessageDeletedPayload),
MessageUpdated(MessageUpdatedPayload),
DirectMessageCreated(DirectMessageCreatedPayload),
DirectMessageDeleted(DirectMessageDeletedPayload),
DirectMessageUpdated(DirectMessageUpdatedPayload),
BotMessageStampsUpdated(BotMessageStampsUpdatedPayload),
ChannelCreated(ChannelCreatedPayload),
ChannelTopicChanged(ChannelTopicChangedPayload),
UserCreated(UserCreatedPayload),
StampCreated(StampCreatedPayload),
TagAdded(TagAddedPayload),
TagRemoved(TagRemovedPayload),
UserGroupCreated(UserGroupCreatedPayload),
UserGroupUpdated(UserGroupUpdatedPayload),
UserGroupDeleted(UserGroupDeletedPayload),
UserGroupMemberAdded(UserGroupMemberAddedPayload),
UserGroupMemberUpdated(UserGroupMemberUpdatedPayload),
UserGroupMemberRemoved(UserGroupMemberRemovedPayload),
UserGroupAdminAdded(UserGroupAdminAddedPayload),
UserGroupAdminRemoved(UserGroupAdminRemovedPayload),
}
event_converts! {
Ping, Joined, Left
}
event_converts! {
MessageCreated, MessageDeleted, MessageUpdated,
DirectMessageCreated, DirectMessageDeleted, DirectMessageUpdated,
BotMessageStampsUpdated
}
event_converts! {
ChannelCreated, ChannelTopicChanged
}
event_converts! {
UserCreated
}
event_converts! {
StampCreated
}
event_converts! {
TagAdded, TagRemoved
}
event_converts! {
UserGroupCreated, UserGroupUpdated, UserGroupDeleted,
UserGroupMemberAdded, UserGroupMemberUpdated, UserGroupMemberRemoved,
UserGroupAdminAdded, UserGroupAdminRemoved
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum EventKind {
Ping,
Joined,
Left,
MessageCreated,
MessageDeleted,
MessageUpdated,
DirectMessageCreated,
DirectMessageDeleted,
DirectMessageUpdated,
BotMessageStampsUpdated,
ChannelCreated,
ChannelTopicChanged,
UserCreated,
StampCreated,
TagAdded,
TagRemoved,
UserGroupCreated,
UserGroupUpdated,
UserGroupDeleted,
UserGroupMemberAdded,
UserGroupMemberUpdated,
UserGroupMemberRemoved,
UserGroupAdminAdded,
UserGroupAdminRemoved,
}
impl Event {
pub fn kind(&self) -> EventKind {
use crate::macros::match_event_to_kind;
match_event_to_kind!(
self,
Ping,
Joined,
Left,
MessageCreated,
MessageDeleted,
MessageUpdated,
DirectMessageCreated,
DirectMessageDeleted,
DirectMessageUpdated,
BotMessageStampsUpdated,
ChannelCreated,
ChannelTopicChanged,
UserCreated,
StampCreated,
TagAdded,
TagRemoved,
UserGroupCreated,
UserGroupUpdated,
UserGroupDeleted,
UserGroupMemberAdded,
UserGroupMemberUpdated,
UserGroupMemberRemoved,
UserGroupAdminAdded,
UserGroupAdminRemoved
)
}
}
impl Display for EventKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use crate::macros::match_event_kinds_to_str;
use EventKind::*;
let s = match_event_kinds_to_str!(
self,
Ping,
Joined,
Left,
MessageCreated,
MessageDeleted,
MessageUpdated,
DirectMessageCreated,
DirectMessageDeleted,
DirectMessageUpdated,
BotMessageStampsUpdated,
ChannelCreated,
ChannelTopicChanged,
UserCreated,
StampCreated,
TagAdded,
TagRemoved,
UserGroupCreated,
UserGroupUpdated,
UserGroupDeleted,
UserGroupMemberAdded,
UserGroupMemberUpdated,
UserGroupMemberRemoved,
UserGroupAdminAdded,
UserGroupAdminRemoved
);
write!(f, "{}", s)
}
}
impl FromStr for EventKind {
type Err = crate::ParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
use crate::macros::match_str_to_event_kinds;
use EventKind::*;
match_str_to_event_kinds!(
s,
Ping,
Joined,
Left,
MessageCreated,
MessageDeleted,
MessageUpdated,
DirectMessageCreated,
DirectMessageDeleted,
DirectMessageUpdated,
BotMessageStampsUpdated,
ChannelCreated,
ChannelTopicChanged,
UserCreated,
StampCreated,
TagAdded,
TagRemoved,
UserGroupCreated,
UserGroupUpdated,
UserGroupDeleted,
UserGroupMemberAdded,
UserGroupMemberUpdated,
UserGroupMemberRemoved,
UserGroupAdminAdded,
UserGroupAdminRemoved
)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::macros::{
test_event_convert, test_event_kind_from_str, test_event_kind_to_string, test_event_to_kind,
};
test_event_convert! {"system", Ping}
test_event_convert! {"system", Joined}
test_event_convert! {"system", Left}
test_event_convert! {"message", MessageCreated}
test_event_convert! {"message", MessageDeleted}
test_event_convert! {"message", MessageUpdated}
test_event_convert! {"message", DirectMessageCreated}
test_event_convert! {"message", DirectMessageDeleted}
test_event_convert! {"message", DirectMessageUpdated}
test_event_convert! {"message", BotMessageStampsUpdated}
test_event_convert! {"channel", ChannelCreated}
test_event_convert! {"channel", ChannelTopicChanged}
test_event_convert! {"user", UserCreated}
test_event_convert! {"stamp", StampCreated}
test_event_convert! {"tag", TagAdded}
test_event_convert! {"tag", TagRemoved}
test_event_convert! {"user-group", UserGroupCreated}
test_event_convert! {"user-group", UserGroupUpdated}
test_event_convert! {"user-group", UserGroupDeleted}
test_event_convert! {"user-group", UserGroupMemberAdded}
test_event_convert! {"user-group", UserGroupMemberUpdated}
test_event_convert! {"user-group", UserGroupMemberRemoved}
test_event_convert! {"user-group", UserGroupAdminAdded}
test_event_convert! {"user-group", UserGroupAdminRemoved}
test_event_to_kind! {"system", Ping}
test_event_to_kind! {"system", Joined}
test_event_to_kind! {"system", Left}
test_event_to_kind! {"message", MessageCreated}
test_event_to_kind! {"message", MessageDeleted}
test_event_to_kind! {"message", MessageUpdated}
test_event_to_kind! {"message", DirectMessageCreated}
test_event_to_kind! {"message", DirectMessageDeleted}
test_event_to_kind! {"message", DirectMessageUpdated}
test_event_to_kind! {"message", BotMessageStampsUpdated}
test_event_to_kind! {"channel", ChannelCreated}
test_event_to_kind! {"channel", ChannelTopicChanged}
test_event_to_kind! {"user", UserCreated}
test_event_to_kind! {"stamp", StampCreated}
test_event_to_kind! {"tag", TagAdded}
test_event_to_kind! {"tag", TagRemoved}
test_event_to_kind! {"user-group", UserGroupCreated}
test_event_to_kind! {"user-group", UserGroupUpdated}
test_event_to_kind! {"user-group", UserGroupDeleted}
test_event_to_kind! {"user-group", UserGroupMemberAdded}
test_event_to_kind! {"user-group", UserGroupMemberUpdated}
test_event_to_kind! {"user-group", UserGroupMemberRemoved}
test_event_to_kind! {"user-group", UserGroupAdminAdded}
test_event_to_kind! {"user-group", UserGroupAdminRemoved}
test_event_kind_from_str! {Ping}
test_event_kind_from_str! {Joined}
test_event_kind_from_str! {Left}
test_event_kind_from_str! {MessageCreated}
test_event_kind_from_str! {MessageDeleted}
test_event_kind_from_str! {MessageUpdated}
test_event_kind_from_str! {DirectMessageCreated}
test_event_kind_from_str! {DirectMessageDeleted}
test_event_kind_from_str! {DirectMessageUpdated}
test_event_kind_from_str! {BotMessageStampsUpdated}
test_event_kind_from_str! {ChannelCreated}
test_event_kind_from_str! {ChannelTopicChanged}
test_event_kind_from_str! {UserCreated}
test_event_kind_from_str! {StampCreated}
test_event_kind_from_str! {TagAdded}
test_event_kind_from_str! {TagRemoved}
test_event_kind_from_str! {UserGroupCreated}
test_event_kind_from_str! {UserGroupUpdated}
test_event_kind_from_str! {UserGroupDeleted}
test_event_kind_from_str! {UserGroupMemberAdded}
test_event_kind_from_str! {UserGroupMemberUpdated}
test_event_kind_from_str! {UserGroupMemberRemoved}
test_event_kind_from_str! {UserGroupAdminAdded}
test_event_kind_from_str! {UserGroupAdminRemoved}
test_event_kind_to_string! {Ping}
test_event_kind_to_string! {Joined}
test_event_kind_to_string! {Left}
test_event_kind_to_string! {MessageCreated}
test_event_kind_to_string! {MessageDeleted}
test_event_kind_to_string! {MessageUpdated}
test_event_kind_to_string! {DirectMessageCreated}
test_event_kind_to_string! {DirectMessageDeleted}
test_event_kind_to_string! {DirectMessageUpdated}
test_event_kind_to_string! {BotMessageStampsUpdated}
test_event_kind_to_string! {ChannelCreated}
test_event_kind_to_string! {ChannelTopicChanged}
test_event_kind_to_string! {UserCreated}
test_event_kind_to_string! {StampCreated}
test_event_kind_to_string! {TagAdded}
test_event_kind_to_string! {TagRemoved}
test_event_kind_to_string! {UserGroupCreated}
test_event_kind_to_string! {UserGroupUpdated}
test_event_kind_to_string! {UserGroupDeleted}
test_event_kind_to_string! {UserGroupMemberAdded}
test_event_kind_to_string! {UserGroupMemberUpdated}
test_event_kind_to_string! {UserGroupMemberRemoved}
test_event_kind_to_string! {UserGroupAdminAdded}
test_event_kind_to_string! {UserGroupAdminRemoved}
}