use super::*;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum AllCommands<'t> {
Unknown(Box<Raw<'t>>),
Cap(Cap<'t>),
ClearChat(ClearChat<'t>),
ClearMsg(ClearMsg<'t>),
GlobalUserState(GlobalUserState<'t>),
HostTarget(HostTarget<'t>),
IrcReady(IrcReady<'t>),
Join(Join<'t>),
Notice(Notice<'t>),
Part(Part<'t>),
Ping(Ping<'t>),
Pong(Pong<'t>),
Privmsg(Privmsg<'t>),
Ready(Ready<'t>),
Reconnect(Reconnect),
RoomState(RoomState<'t>),
UserNotice(UserNotice<'t>),
UserState(UserState<'t>),
Whisper(Whisper<'t>),
}
impl<'a: 't, 't> Parse<&'a Message<'t>> for AllCommands<'t> {
fn parse(msg: &'a Message<'t>) -> Result<Self, InvalidMessage> {
let out = match &*msg.command {
"001" => IrcReady::parse(msg)?.into(),
"376" => Ready::parse(msg)?.into(),
"CAP" => Cap::parse(msg)?.into(),
"CLEARCHAT" => ClearChat::parse(msg)?.into(),
"CLEARMSG" => ClearMsg::parse(msg)?.into(),
"GLOBALUSERSTATE" => GlobalUserState::parse(msg)?.into(),
"HOSTTARGET" => HostTarget::parse(msg)?.into(),
"JOIN" => Join::parse(msg)?.into(),
"NOTICE" => Notice::parse(msg)?.into(),
"PART" => Part::parse(msg)?.into(),
"PING" => Ping::parse(msg)?.into(),
"PONG" => Pong::parse(msg)?.into(),
"PRIVMSG" => Privmsg::parse(msg)?.into(),
"RECONNECT" => Reconnect::parse(msg)?.into(),
"ROOMSTATE" => RoomState::parse(msg)?.into(),
"USERNOTICE" => UserNotice::parse(msg)?.into(),
"USERSTATE" => UserState::parse(msg)?.into(),
"WHISPER" => Whisper::parse(msg)?.into(),
_ => msg.clone().into(),
};
Ok(out)
}
}
impl<'t> AsOwned for AllCommands<'t> {
type Owned = AllCommands<'static>;
fn as_owned(&self) -> Self::Owned {
match self {
AllCommands::Unknown(inner) => AllCommands::Unknown(Box::new((**inner).as_owned())),
AllCommands::Cap(inner) => AllCommands::Cap(inner.as_owned()),
AllCommands::ClearChat(inner) => AllCommands::ClearChat(inner.as_owned()),
AllCommands::ClearMsg(inner) => AllCommands::ClearMsg(inner.as_owned()),
AllCommands::GlobalUserState(inner) => AllCommands::GlobalUserState(inner.as_owned()),
AllCommands::HostTarget(inner) => AllCommands::HostTarget(inner.as_owned()),
AllCommands::IrcReady(inner) => AllCommands::IrcReady(inner.as_owned()),
AllCommands::Join(inner) => AllCommands::Join(inner.as_owned()),
AllCommands::Notice(inner) => AllCommands::Notice(inner.as_owned()),
AllCommands::Part(inner) => AllCommands::Part(inner.as_owned()),
AllCommands::Ping(inner) => AllCommands::Ping(inner.as_owned()),
AllCommands::Pong(inner) => AllCommands::Pong(inner.as_owned()),
AllCommands::Privmsg(inner) => AllCommands::Privmsg(inner.as_owned()),
AllCommands::Ready(inner) => AllCommands::Ready(inner.as_owned()),
AllCommands::Reconnect(inner) => AllCommands::Reconnect(inner.as_owned()),
AllCommands::RoomState(inner) => AllCommands::RoomState(inner.as_owned()),
AllCommands::UserNotice(inner) => AllCommands::UserNotice(inner.as_owned()),
AllCommands::UserState(inner) => AllCommands::UserState(inner.as_owned()),
AllCommands::Whisper(inner) => AllCommands::Whisper(inner.as_owned()),
}
}
}
impl<'t> From<Raw<'t>> for AllCommands<'t> {
fn from(msg: Raw<'t>) -> Self {
Self::Unknown(Box::new(msg))
}
}
impl<'t> From<Reconnect> for AllCommands<'t> {
fn from(msg: Reconnect) -> Self {
Self::Reconnect(msg)
}
}
macro_rules! from {
($($ident:tt),* $(,)?) => {
$(
impl<'t> From<$ident<'t>> for AllCommands<'t> {
fn from(msg: $ident<'t>) -> Self {
Self::$ident(msg)
}
}
)*
};
}
from! {
Cap,
ClearChat,
ClearMsg,
GlobalUserState,
HostTarget,
IrcReady,
Join,
Notice,
Part,
Ping,
Pong,
Privmsg,
Ready,
RoomState,
UserNotice,
UserState,
Whisper,
}
pub trait Extract<'a, T: 'a> {
fn extract(&'a self) -> Option<T>;
}
impl<'a: 't, 't> Extract<'a, &'a Reconnect> for &'a AllCommands<'t> {
fn extract(&'a self) -> Option<&'a Reconnect> {
match self {
AllCommands::Reconnect(inner) => Some(inner),
_ => None,
}
}
}
impl<'a: 't, 't> Extract<'a, &'a Raw<'t>> for &'a AllCommands<'t> {
fn extract(&'a self) -> Option<&'a Raw<'t>> {
match self {
AllCommands::Unknown(inner) => Some(&*inner),
_ => None,
}
}
}
macro_rules! impl_extract {
($($ident:tt),* $(,)?) => {
$(
impl<'a: 't, 't> Extract<'a, &'a $ident<'t>> for &'a AllCommands<'t> {
fn extract(&'a self) -> Option<&'a $ident<'t>> {
match self {
AllCommands::$ident(inner) => Some(inner),
_ => None
}
}
}
)*
};
}
impl_extract! {
Cap,
ClearChat,
ClearMsg,
GlobalUserState,
HostTarget,
IrcReady,
Join,
Notice,
Part,
Ping,
Pong,
Privmsg,
Ready,
RoomState,
UserNotice,
UserState,
Whisper,
}