use std::fmt;
use std::str;
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Code {
Pass,
Nick,
User,
Oper,
Mode,
Service,
Quit,
Squit,
Join,
Part,
Topic,
Names,
List,
Invite,
Kick,
Privmsg,
Notice,
Motd,
Lusers,
Version,
Stats,
Links,
Time,
Connect,
Trace,
Admin,
Info,
Servlist,
Squery,
Who,
Whois,
Whowas,
Kill,
Ping,
Pong,
Error,
Away,
Rehash,
Die,
Restart,
Summon,
Users,
Wallops,
Userhost,
Ison,
RplWelcome,
RplYourhost,
RplCreated,
RplMyinfo,
RplBounce,
RplUserhost,
RplIson,
RplAway,
RplUnaway,
RplNowaway,
RplWhoisuser,
RplWhoisserver,
RplWhoisoperator,
RplWhoisidle,
RplEndofwhois,
RplWhoischannels,
RplWhowasuser,
RplEndofwhowas,
RplListstart,
RplList,
RplListend,
RplUniqopis,
RplChannelmodeis,
RplNotopic,
RplTopic,
RplInviting,
RplSummoning,
RplInvitelist,
RplEndofinvitelist,
RplExceptlist,
RplEndofexecptlist,
RplVersion,
RplWhoreply,
RplEndofwho,
RplNamreply,
RplEndofnames,
RplLinks,
RplEndoflinks,
RplBanlist,
RplEndofbanlist,
RplInfo,
RplEndofinfo,
RplMotdstart,
RplMotd,
RplEndofmotd,
RplYoureoper,
RplRehashing,
RplYoureservice,
RplTime,
RplUsersstart,
RplUsers,
RplEndofusers,
RplNousers,
RplTracelink,
RplTraceconnecting,
RplTracehandshake,
RplTraceuknown,
RplTraceoperator,
RplTraceuser,
RplTraceserver,
RplTraceservice,
RplTracenewtype,
RplTraceclass,
RplTracereconnect,
RplTracelog,
RplTraceend,
RplStatslinkinfo,
RplStatscommands,
RplEndofstats,
RplStatsuptime,
RplStatsoline,
RplUmodeis,
RplServlist,
RplServlistend,
RplLuserclient,
RplLuserop,
RplLuserunknown,
RplLuserchannels,
RplLuserme,
RplAdminme,
RplAdminloc1,
RplAdminloc2,
RplAdminemail,
RplTryagain,
ErrNosuchnick,
ErrNosuchserver,
ErrNosuchchannel,
ErrCannotsendtochan,
ErrToomanychannels,
ErrWasnosuchnick,
ErrToomanytargets,
ErrNosuchservice,
ErrNoorigin,
ErrNorecipient,
ErrNotexttosend,
ErrNotoplevel,
ErrWildtoplevel,
ErrBadmask,
ErrUnknowncommand,
ErrNomotd,
ErrNoadmininfo,
ErrFileerror,
ErrNonicknamegiven,
ErrErroneousnickname,
ErrNicknameinuse,
ErrNickcollision,
ErrUnavailresource,
ErrUsernotinchannel,
ErrNotonchannel,
ErrUseronchannel,
ErrNologin,
ErrSummondisabled,
ErrUsersdisabled,
ErrNotregistered,
ErrNeedmoreparams,
ErrAlreadyregistred,
ErrNopermforhost,
ErrPasswdmismatch,
ErrYourebannedcreep,
ErrYouwillbebanned,
ErrKeyset,
ErrChannelisfull,
ErrUnknownmode,
ErrInviteonlychan,
ErrBannedfromchan,
ErrBadchannelkey,
ErrBadchanmask,
ErrNochanmodes,
ErrBanlistfull,
ErrNoprivileges,
ErrChanoprivsneeded,
ErrCantkillserver,
ErrRestricted,
ErrUniqopprivsneeded,
ErrNooperhost,
ErrUmodeunknownflag,
ErrUsersdontmatch,
Unknown(String),
}
impl Code {
pub fn is_reply(&self) -> bool {
match *self {
Code::RplWelcome => true,
Code::RplYourhost => true,
Code::RplCreated => true,
Code::RplMyinfo => true,
Code::RplBounce => true,
Code::RplUserhost => true,
Code::RplIson => true,
Code::RplAway => true,
Code::RplUnaway => true,
Code::RplNowaway => true,
Code::RplWhoisuser => true,
Code::RplWhoisserver => true,
Code::RplWhoisoperator => true,
Code::RplWhoisidle => true,
Code::RplEndofwhois => true,
Code::RplWhoischannels => true,
Code::RplWhowasuser => true,
Code::RplEndofwhowas => true,
Code::RplListstart => true,
Code::RplList => true,
Code::RplListend => true,
Code::RplUniqopis => true,
Code::RplChannelmodeis => true,
Code::RplNotopic => true,
Code::RplTopic => true,
Code::RplInviting => true,
Code::RplSummoning => true,
Code::RplInvitelist => true,
Code::RplEndofinvitelist => true,
Code::RplExceptlist => true,
Code::RplEndofexecptlist => true,
Code::RplVersion => true,
Code::RplWhoreply => true,
Code::RplEndofwho => true,
Code::RplNamreply => true,
Code::RplEndofnames => true,
Code::RplLinks => true,
Code::RplEndoflinks => true,
Code::RplBanlist => true,
Code::RplEndofbanlist => true,
Code::RplInfo => true,
Code::RplEndofinfo => true,
Code::RplMotdstart => true,
Code::RplMotd => true,
Code::RplEndofmotd => true,
Code::RplYoureoper => true,
Code::RplRehashing => true,
Code::RplYoureservice => true,
Code::RplTime => true,
Code::RplUsersstart => true,
Code::RplUsers => true,
Code::RplEndofusers => true,
Code::RplNousers => true,
Code::RplTracelink => true,
Code::RplTraceconnecting => true,
Code::RplTracehandshake => true,
Code::RplTraceuknown => true,
Code::RplTraceoperator => true,
Code::RplTraceuser => true,
Code::RplTraceserver => true,
Code::RplTraceservice => true,
Code::RplTracenewtype => true,
Code::RplTraceclass => true,
Code::RplTracereconnect => true,
Code::RplTracelog => true,
Code::RplTraceend => true,
Code::RplStatslinkinfo => true,
Code::RplStatscommands => true,
Code::RplEndofstats => true,
Code::RplStatsuptime => true,
Code::RplStatsoline => true,
Code::RplUmodeis => true,
Code::RplServlist => true,
Code::RplServlistend => true,
Code::RplLuserclient => true,
Code::RplLuserop => true,
Code::RplLuserunknown => true,
Code::RplLuserchannels => true,
Code::RplLuserme => true,
Code::RplAdminme => true,
Code::RplAdminloc1 => true,
Code::RplAdminloc2 => true,
Code::RplAdminemail => true,
Code::RplTryagain => true,
_ => false,
}
}
pub fn is_error(&self) -> bool {
match *self {
Code::ErrNosuchnick => true,
Code::ErrNosuchserver => true,
Code::ErrNosuchchannel => true,
Code::ErrCannotsendtochan => true,
Code::ErrToomanychannels => true,
Code::ErrWasnosuchnick => true,
Code::ErrToomanytargets => true,
Code::ErrNosuchservice => true,
Code::ErrNoorigin => true,
Code::ErrNorecipient => true,
Code::ErrNotexttosend => true,
Code::ErrNotoplevel => true,
Code::ErrWildtoplevel => true,
Code::ErrBadmask => true,
Code::ErrUnknowncommand => true,
Code::ErrNomotd => true,
Code::ErrNoadmininfo => true,
Code::ErrFileerror => true,
Code::ErrNonicknamegiven => true,
Code::ErrErroneousnickname => true,
Code::ErrNicknameinuse => true,
Code::ErrNickcollision => true,
Code::ErrUnavailresource => true,
Code::ErrUsernotinchannel => true,
Code::ErrNotonchannel => true,
Code::ErrUseronchannel => true,
Code::ErrNologin => true,
Code::ErrSummondisabled => true,
Code::ErrUsersdisabled => true,
Code::ErrNotregistered => true,
Code::ErrNeedmoreparams => true,
Code::ErrAlreadyregistred => true,
Code::ErrNopermforhost => true,
Code::ErrPasswdmismatch => true,
Code::ErrYourebannedcreep => true,
Code::ErrYouwillbebanned => true,
Code::ErrKeyset => true,
Code::ErrChannelisfull => true,
Code::ErrUnknownmode => true,
Code::ErrInviteonlychan => true,
Code::ErrBannedfromchan => true,
Code::ErrBadchannelkey => true,
Code::ErrBadchanmask => true,
Code::ErrNochanmodes => true,
Code::ErrBanlistfull => true,
Code::ErrNoprivileges => true,
Code::ErrChanoprivsneeded => true,
Code::ErrCantkillserver => true,
Code::ErrRestricted => true,
Code::ErrUniqopprivsneeded => true,
Code::ErrNooperhost => true,
Code::ErrUmodeunknownflag => true,
Code::ErrUsersdontmatch => true,
_ => false,
}
}
}
impl fmt::Display for Code {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let text = match *self {
Code::Pass => "PASS",
Code::Nick => "NICK",
Code::User => "USER",
Code::Oper => "OPER",
Code::Mode => "MODE",
Code::Service => "SERVICE",
Code::Quit => "QUIT",
Code::Squit => "SQUIT",
Code::Join => "JOIN",
Code::Part => "PART",
Code::Topic => "TOPIC",
Code::Names => "NAMES",
Code::List => "LIST",
Code::Invite => "INVITE",
Code::Kick => "KICK",
Code::Privmsg => "PRIVMSG",
Code::Notice => "NOTICE",
Code::Motd => "MOTD",
Code::Lusers => "LUSERS",
Code::Version => "VERSION",
Code::Stats => "STATS",
Code::Links => "LINKS",
Code::Time => "TIME",
Code::Connect => "CONNECT",
Code::Trace => "TRACE",
Code::Admin => "ADMIN",
Code::Info => "INFO",
Code::Servlist => "SERVLIST",
Code::Squery => "SQUERY",
Code::Who => "WHO",
Code::Whois => "WHOIS",
Code::Whowas => "WHOWAS",
Code::Kill => "KILL",
Code::Ping => "PING",
Code::Pong => "PONG",
Code::Error => "ERROR",
Code::Away => "AWAY",
Code::Rehash => "REHASH",
Code::Die => "DIE",
Code::Restart => "RESTART",
Code::Summon => "SUMMON",
Code::Users => "USERS",
Code::Wallops => "WALLOPS",
Code::Userhost => "USERHOST",
Code::Ison => "ISON",
Code::RplWelcome => "001",
Code::RplYourhost => "002",
Code::RplCreated => "003",
Code::RplMyinfo => "004",
Code::RplBounce => "005",
Code::RplUserhost => "302",
Code::RplIson => "303",
Code::RplAway => "301",
Code::RplUnaway => "305",
Code::RplNowaway => "306",
Code::RplWhoisuser => "311",
Code::RplWhoisserver => "312",
Code::RplWhoisoperator => "313",
Code::RplWhoisidle => "317",
Code::RplEndofwhois => "318",
Code::RplWhoischannels => "319",
Code::RplWhowasuser => "314",
Code::RplEndofwhowas => "369",
Code::RplListstart => "321",
Code::RplList => "322",
Code::RplListend => "323",
Code::RplUniqopis => "325",
Code::RplChannelmodeis => "324",
Code::RplNotopic => "331",
Code::RplTopic => "332",
Code::RplInviting => "341",
Code::RplSummoning => "342",
Code::RplInvitelist => "346",
Code::RplEndofinvitelist => "347",
Code::RplExceptlist => "348",
Code::RplEndofexecptlist => "349",
Code::RplVersion => "351",
Code::RplWhoreply => "352",
Code::RplEndofwho => "315",
Code::RplNamreply => "353",
Code::RplEndofnames => "366",
Code::RplLinks => "364",
Code::RplEndoflinks => "365",
Code::RplBanlist => "367",
Code::RplEndofbanlist => "368",
Code::RplInfo => "371",
Code::RplEndofinfo => "374",
Code::RplMotdstart => "375",
Code::RplMotd => "372",
Code::RplEndofmotd => "376",
Code::RplYoureoper => "381",
Code::RplRehashing => "382",
Code::RplYoureservice => "383",
Code::RplTime => "391",
Code::RplUsersstart => "392",
Code::RplUsers => "393",
Code::RplEndofusers => "394",
Code::RplNousers => "395",
Code::RplTracelink => "200",
Code::RplTraceconnecting => "201",
Code::RplTracehandshake => "202",
Code::RplTraceuknown => "203",
Code::RplTraceoperator => "204",
Code::RplTraceuser => "205",
Code::RplTraceserver => "206",
Code::RplTraceservice => "207",
Code::RplTracenewtype => "208",
Code::RplTraceclass => "209",
Code::RplTracereconnect => "210",
Code::RplTracelog => "261",
Code::RplTraceend => "262",
Code::RplStatslinkinfo => "211",
Code::RplStatscommands => "212",
Code::RplEndofstats => "219",
Code::RplStatsuptime => "242",
Code::RplStatsoline => "243",
Code::RplUmodeis => "221",
Code::RplServlist => "234",
Code::RplServlistend => "235",
Code::RplLuserclient => "251",
Code::RplLuserop => "252",
Code::RplLuserunknown => "253",
Code::RplLuserchannels => "254",
Code::RplLuserme => "255",
Code::RplAdminme => "256",
Code::RplAdminloc1 => "257",
Code::RplAdminloc2 => "258",
Code::RplAdminemail => "259",
Code::RplTryagain => "263",
Code::ErrNosuchnick => "401",
Code::ErrNosuchserver => "402",
Code::ErrNosuchchannel => "403",
Code::ErrCannotsendtochan => "404",
Code::ErrToomanychannels => "405",
Code::ErrWasnosuchnick => "406",
Code::ErrToomanytargets => "407",
Code::ErrNosuchservice => "408",
Code::ErrNoorigin => "409",
Code::ErrNorecipient => "411",
Code::ErrNotexttosend => "412",
Code::ErrNotoplevel => "413",
Code::ErrWildtoplevel => "414",
Code::ErrBadmask => "415",
Code::ErrUnknowncommand => "421",
Code::ErrNomotd => "422",
Code::ErrNoadmininfo => "423",
Code::ErrFileerror => "424",
Code::ErrNonicknamegiven => "431",
Code::ErrErroneousnickname => "432",
Code::ErrNicknameinuse => "433",
Code::ErrNickcollision => "436",
Code::ErrUnavailresource => "437",
Code::ErrUsernotinchannel => "441",
Code::ErrNotonchannel => "442",
Code::ErrUseronchannel => "443",
Code::ErrNologin => "444",
Code::ErrSummondisabled => "445",
Code::ErrUsersdisabled => "446",
Code::ErrNotregistered => "451",
Code::ErrNeedmoreparams => "461",
Code::ErrAlreadyregistred => "462",
Code::ErrNopermforhost => "463",
Code::ErrPasswdmismatch => "464",
Code::ErrYourebannedcreep => "465",
Code::ErrYouwillbebanned => "466",
Code::ErrKeyset => "467",
Code::ErrChannelisfull => "471",
Code::ErrUnknownmode => "472",
Code::ErrInviteonlychan => "473",
Code::ErrBannedfromchan => "474",
Code::ErrBadchannelkey => "475",
Code::ErrBadchanmask => "476",
Code::ErrNochanmodes => "477",
Code::ErrBanlistfull => "478",
Code::ErrNoprivileges => "481",
Code::ErrChanoprivsneeded => "482",
Code::ErrCantkillserver => "483",
Code::ErrRestricted => "484",
Code::ErrUniqopprivsneeded => "485",
Code::ErrNooperhost => "491",
Code::ErrUmodeunknownflag => "501",
Code::ErrUsersdontmatch => "502",
Code::Unknown(ref text) => &text[..],
};
f.write_str(text)
}
}
impl str::FromStr for Code {
type Err = ();
fn from_str(s: &str) -> Result<Code, ()> {
let code = match s {
"PASS" => Code::Pass,
"NICK" => Code::Nick,
"USER" => Code::User,
"OPER" => Code::Oper,
"MODE" => Code::Mode,
"SERVICE" => Code::Service,
"QUIT" => Code::Quit,
"SQUIT" => Code::Squit,
"JOIN" => Code::Join,
"PART" => Code::Part,
"TOPIC" => Code::Topic,
"NAMES" => Code::Names,
"LIST" => Code::List,
"INVITE" => Code::Invite,
"KICK" => Code::Kick,
"PRIVMSG" => Code::Privmsg,
"NOTICE" => Code::Notice,
"MOTD" => Code::Motd,
"LUSERS" => Code::Lusers,
"VERSION" => Code::Version,
"STATS" => Code::Stats,
"LINKS" => Code::Links,
"TIME" => Code::Time,
"CONNECT" => Code::Connect,
"TRACE" => Code::Trace,
"ADMIN" => Code::Admin,
"INFO" => Code::Info,
"SERVLIST" => Code::Servlist,
"SQUERY" => Code::Squery,
"WHO" => Code::Who,
"WHOIS" => Code::Whois,
"WHOWAS" => Code::Whowas,
"KILL" => Code::Kill,
"PING" => Code::Ping,
"PONG" => Code::Pong,
"ERROR" => Code::Error,
"AWAY" => Code::Away,
"REHASH" => Code::Rehash,
"DIE" => Code::Die,
"RESTART" => Code::Restart,
"SUMMON" => Code::Summon,
"USERS" => Code::Users,
"WALLOPS" => Code::Wallops,
"USERHOST" => Code::Userhost,
"ISON" => Code::Ison,
"001" => Code::RplWelcome,
"002" => Code::RplYourhost,
"003" => Code::RplCreated,
"004" => Code::RplMyinfo,
"005" => Code::RplBounce,
"302" => Code::RplUserhost,
"303" => Code::RplIson,
"301" => Code::RplAway,
"305" => Code::RplUnaway,
"306" => Code::RplNowaway,
"311" => Code::RplWhoisuser,
"312" => Code::RplWhoisserver,
"313" => Code::RplWhoisoperator,
"317" => Code::RplWhoisidle,
"318" => Code::RplEndofwhois,
"319" => Code::RplWhoischannels,
"314" => Code::RplWhowasuser,
"369" => Code::RplEndofwhowas,
"321" => Code::RplListstart,
"322" => Code::RplList,
"323" => Code::RplListend,
"325" => Code::RplUniqopis,
"324" => Code::RplChannelmodeis,
"331" => Code::RplNotopic,
"332" => Code::RplTopic,
"341" => Code::RplInviting,
"342" => Code::RplSummoning,
"346" => Code::RplInvitelist,
"347" => Code::RplEndofinvitelist,
"348" => Code::RplExceptlist,
"349" => Code::RplEndofexecptlist,
"351" => Code::RplVersion,
"352" => Code::RplWhoreply,
"315" => Code::RplEndofwho,
"353" => Code::RplNamreply,
"366" => Code::RplEndofnames,
"364" => Code::RplLinks,
"365" => Code::RplEndoflinks,
"367" => Code::RplBanlist,
"368" => Code::RplEndofbanlist,
"371" => Code::RplInfo,
"374" => Code::RplEndofinfo,
"375" => Code::RplMotdstart,
"372" => Code::RplMotd,
"376" => Code::RplEndofmotd,
"381" => Code::RplYoureoper,
"382" => Code::RplRehashing,
"383" => Code::RplYoureservice,
"391" => Code::RplTime,
"392" => Code::RplUsersstart,
"393" => Code::RplUsers,
"394" => Code::RplEndofusers,
"395" => Code::RplNousers,
"200" => Code::RplTracelink,
"201" => Code::RplTraceconnecting,
"202" => Code::RplTracehandshake,
"203" => Code::RplTraceuknown,
"204" => Code::RplTraceoperator,
"205" => Code::RplTraceuser,
"206" => Code::RplTraceserver,
"207" => Code::RplTraceservice,
"208" => Code::RplTracenewtype,
"209" => Code::RplTraceclass,
"210" => Code::RplTracereconnect,
"261" => Code::RplTracelog,
"262" => Code::RplTraceend,
"211" => Code::RplStatslinkinfo,
"212" => Code::RplStatscommands,
"219" => Code::RplEndofstats,
"242" => Code::RplStatsuptime,
"243" => Code::RplStatsoline,
"221" => Code::RplUmodeis,
"234" => Code::RplServlist,
"235" => Code::RplServlistend,
"251" => Code::RplLuserclient,
"252" => Code::RplLuserop,
"253" => Code::RplLuserunknown,
"254" => Code::RplLuserchannels,
"255" => Code::RplLuserme,
"256" => Code::RplAdminme,
"257" => Code::RplAdminloc1,
"258" => Code::RplAdminloc2,
"259" => Code::RplAdminemail,
"263" => Code::RplTryagain,
"401" => Code::ErrNosuchnick,
"402" => Code::ErrNosuchserver,
"403" => Code::ErrNosuchchannel,
"404" => Code::ErrCannotsendtochan,
"405" => Code::ErrToomanychannels,
"406" => Code::ErrWasnosuchnick,
"407" => Code::ErrToomanytargets,
"408" => Code::ErrNosuchservice,
"409" => Code::ErrNoorigin,
"411" => Code::ErrNorecipient,
"412" => Code::ErrNotexttosend,
"413" => Code::ErrNotoplevel,
"414" => Code::ErrWildtoplevel,
"415" => Code::ErrBadmask,
"421" => Code::ErrUnknowncommand,
"422" => Code::ErrNomotd,
"423" => Code::ErrNoadmininfo,
"424" => Code::ErrFileerror,
"431" => Code::ErrNonicknamegiven,
"432" => Code::ErrErroneousnickname,
"433" => Code::ErrNicknameinuse,
"436" => Code::ErrNickcollision,
"437" => Code::ErrUnavailresource,
"441" => Code::ErrUsernotinchannel,
"442" => Code::ErrNotonchannel,
"443" => Code::ErrUseronchannel,
"444" => Code::ErrNologin,
"445" => Code::ErrSummondisabled,
"446" => Code::ErrUsersdisabled,
"451" => Code::ErrNotregistered,
"461" => Code::ErrNeedmoreparams,
"462" => Code::ErrAlreadyregistred,
"463" => Code::ErrNopermforhost,
"464" => Code::ErrPasswdmismatch,
"465" => Code::ErrYourebannedcreep,
"466" => Code::ErrYouwillbebanned,
"467" => Code::ErrKeyset,
"471" => Code::ErrChannelisfull,
"472" => Code::ErrUnknownmode,
"473" => Code::ErrInviteonlychan,
"474" => Code::ErrBannedfromchan,
"475" => Code::ErrBadchannelkey,
"476" => Code::ErrBadchanmask,
"477" => Code::ErrNochanmodes,
"478" => Code::ErrBanlistfull,
"481" => Code::ErrNoprivileges,
"482" => Code::ErrChanoprivsneeded,
"483" => Code::ErrCantkillserver,
"484" => Code::ErrRestricted,
"485" => Code::ErrUniqopprivsneeded,
"491" => Code::ErrNooperhost,
"501" => Code::ErrUmodeunknownflag,
"502" => Code::ErrUsersdontmatch,
_ => Code::Unknown(s.to_string()),
};
Ok(code)
}
}