use std::fmt;
#[derive(Clone)]
pub(crate) struct WhoIsChannelStruct<'a> {
pub(crate) prefix: Option<String>,
pub(crate) channel: &'a str,
}
#[derive(Clone)]
pub(crate) struct NameReplyStruct<'a> {
pub(crate) prefix: String,
pub(crate) nick: &'a str,
}
pub(crate) enum Reply<'a> {
RplWelcome001{ client: &'a str, networkname: &'a str, nick: &'a str,
user: &'a str, host: &'a str },
RplYourHost002{ client: &'a str, servername: &'a str, version: &'a str },
RplCreated003{ client: &'a str, datetime: &'a str },
RplMyInfo004{ client: &'a str, servername: &'a str, version: &'a str,
avail_user_modes: &'a str, avail_chmodes: &'a str,
avail_chmodes_with_params: Option<&'a str> },
RplISupport005{ client: &'a str, tokens: &'a str },
RplStatsCommands212{ client: &'a str, command: &'a str, count: u64 },
RplEndOfStats219{ client: &'a str, stat: char },
RplUModeIs221{ client: &'a str, user_modes: &'a str },
RplStatsUptime242{ client: &'a str, seconds: u64 },
RplLUserClient251{ client: &'a str, users_num: usize, inv_users_num: usize,
servers_num: usize },
RplLUserOp252{ client: &'a str, ops_num: usize },
RplLUserUnknown253{ client: &'a str, conns_num: usize },
RplLUserChannels254{ client: &'a str, channels_num: usize },
RplLUserMe255{ client: &'a str, clients_num: usize, servers_num: usize },
RplAdminMe256{ client: &'a str, server: &'a str },
RplAdminLoc1257{ client: &'a str, info: &'a str },
RplAdminLoc2258{ client: &'a str, info: &'a str },
RplAdminEmail259{ client: &'a str, email: &'a str },
RplLocalUsers265{ client: &'a str, clients_num: usize, max_clients_num: usize },
RplGlobalUsers266{ client: &'a str, clients_num: usize, max_clients_num: usize },
RplAway301{ client: &'a str, nick: &'a str, message: &'a str },
RplUserHost302{ client: &'a str, replies: &'a [String] },
RplIson303{ client: &'a str, nicknames: &'a [&'a str] },
RplUnAway305{ client: &'a str },
RplNowAway306{ client: &'a str },
RplWhoReply352{ client: &'a str, channel: &'a str, username: &'a str, host: &'a str,
server: &'a str, nick: &'a str, flags: &'a str,
hopcount: usize, realname: &'a str },
RplEndOfWho315{ client: &'a str, mask: &'a str },
RplWhoIsRegNick307{ client: &'a str, nick: &'a str },
RplWhoIsUser311{ client: &'a str, nick: &'a str, username: &'a str, host: &'a str,
realname: &'a str },
RplWhoIsServer312{ client: &'a str, nick: &'a str, server: &'a str,
server_info: &'a str },
RplWhoIsOperator313{ client: &'a str, nick: &'a str },
RplWhoWasUser314{ client: &'a str, nick: &'a str, username: &'a str, host: &'a str,
realname: &'a str },
RplwhoIsIdle317{ client: &'a str, nick: &'a str, secs: u64, signon: u64 },
RplEndOfWhoIs318{ client: &'a str, nick: &'a str },
RplWhoIsChannels319{ client: &'a str, nick: &'a str,
channels: &'a [WhoIsChannelStruct<'a>] },
RplListStart321{ client: &'a str },
RplList322{ client: &'a str, channel: &'a str, client_count: usize, topic: &'a str },
RplListEnd323{ client: &'a str },
RplChannelModeIs324{ client: &'a str, channel: &'a str, modestring: &'a str },
RplCreationTime329{ client: &'a str, channel: &'a str, creation_time: u64 },
RplNoTopic331{ client: &'a str, channel: &'a str },
RplTopic332{ client: &'a str, channel: &'a str, topic: &'a str },
RplTopicWhoTime333{ client: &'a str, channel: &'a str, nick: &'a str, setat: u64 },
RplInviting341{ client: &'a str, nick: &'a str, channel: &'a str },
RplInviteList346{ client: &'a str, channel: &'a str, mask: &'a str },
RplEndOfInviteList347{ client: &'a str, channel: &'a str },
RplExceptList348{ client: &'a str, channel: &'a str, mask: &'a str },
RplEndOfExceptList349{ client: &'a str, channel: &'a str },
RplVersion351{ client: &'a str, version: &'a str, server: &'a str,
comments: &'a str },
RplNameReply353{ client: &'a str, symbol: &'a str, channel: &'a str,
replies: &'a[NameReplyStruct<'a>] },
RplEndOfNames366{ client: &'a str, channel: &'a str },
RplLinks364{ client: &'a str, mask: &'a str, server: &'a str, hop_count: u64,
server_info: &'a str },
RplEndOfLinks365{ client: &'a str, mask: &'a str },
RplBanList367{ client: &'a str, channel: &'a str, mask: &'a str,
who: &'a str, set_ts: u64 },
RplEndOfBanList368{ client: &'a str, channel: &'a str },
RplEndOfWhoWas369{ client: &'a str, nick: &'a str },
RplInfo371{ client: &'a str, info: &'a str },
RplEndOfInfo374{ client: &'a str },
RplMotdStart375{ client: &'a str, server: &'a str },
RplMotd372{ client: &'a str, motd: &'a str },
RplEndOfMotd376{ client: &'a str },
RplWhoIsHost378{ client: &'a str, nick: &'a str, host_info: &'a str },
RplWhoIsModes379{ client: &'a str, nick: &'a str, modes: &'a str },
RplYoureOper381{ client: &'a str },
RplTime391{ client: &'a str, server: &'a str, timestamp: u64, ts_offset: &'a str,
human_readable: &'a str },
ErrUnknownError400{ client: &'a str, command: &'a str, subcommand: Option<&'a str>,
info: &'a str },
ErrNoSuchNick401{ client: &'a str, nick: &'a str },
ErrNoSuchChannel403{ client: &'a str, channel: &'a str },
ErrCannotSendToChain404{ client: &'a str, channel: &'a str },
ErrTooManyChannels405{ client: &'a str, channel: &'a str },
ErrWasNoSuchNick406{ client: &'a str, nick: &'a str },
ErrInputTooLong417{ client: &'a str },
ErrUnknownCommand421{ client: &'a str, command: &'a str },
ErrNicknameInUse433{ client: &'a str, nick: &'a str },
ErrUserNotInChannel441{ client: &'a str, nick: &'a str, channel: &'a str },
ErrNotOnChannel442{ client: &'a str, channel: &'a str },
ErrUserOnChannel443{ client: &'a str, nick: &'a str, channel: &'a str },
ErrNotRegistered451{ client: &'a str },
ErrNeedMoreParams461{ client: &'a str, command: &'a str },
ErrAlreadyRegistered462{ client: &'a str },
ErrPasswdMismatch464{ client: &'a str },
ErrChannelIsFull471{ client: &'a str, channel: &'a str },
ErrUnknownMode472{ client: &'a str, modechar: char, channel: &'a str },
ErrInviteOnlyChan473{ client: &'a str, channel: &'a str },
ErrBannedFromChan474{ client: &'a str, channel: &'a str },
ErrBadChannelKey475{ client: &'a str, channel: &'a str },
ErrNoPrivileges481{ client: &'a str },
ErrChanOpPrivsNeeded482{ client: &'a str, channel: &'a str },
ErrCantKillServer483{ client: &'a str },
ErrYourConnRestricted484{ client: &'a str },
ErrNoOperHost491{ client: &'a str },
ErrUmodeUnknownFlag501{ client: &'a str },
ErrUsersDontMatch502{ client: &'a str },
ErrHelpNotFound524{ client: &'a str, subject: &'a str },
RplWhoIsSecure671{ client: &'a str, nick: &'a str },
ErrInvalidModeParam696{ client: &'a str, target: &'a str, modechar: char,
param: &'a str, description: &'a str },
RplHelpStart704{ client: &'a str, subject: &'a str, line: &'a str },
RplHelpTxt705{ client: &'a str, subject: &'a str, line: &'a str },
RplEndOfHelp706{ client: &'a str, subject: &'a str, line: &'a str },
ErrCannotDoCommand972{ client: &'a str },
}
use Reply::*;
impl<'a> fmt::Display for Reply<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
RplWelcome001{ client, networkname, nick, user, host } => {
write!(f, "001 {} :Welcome to the {} Network, {}!~{}@{}",
client, networkname, nick, user, host) }
RplYourHost002{ client, servername, version } => {
write!(f, "002 {} :Your host is {}, running version {}",
client, servername, version) }
RplCreated003{ client, datetime } => {
write!(f, "003 {} :This server was created {}", client, datetime) }
RplMyInfo004{ client, servername, version, avail_user_modes,
avail_chmodes, avail_chmodes_with_params } => {
if let Some(p) = avail_chmodes_with_params {
write!(f, "004 {} {} {} {} {} {}", client, servername, version,
avail_user_modes, avail_chmodes, p)
} else {
write!(f, "004 {} {} {} {} {}", client, servername, version,
avail_user_modes, avail_chmodes) } }
RplISupport005{ client, tokens } => {
write!(f, "005 {} {} :are supported by this server", client, tokens) }
RplStatsCommands212{ client, command, count } => {
write!(f, "212 {} {} {}", client, command, count) }
RplEndOfStats219{ client, stat } => {
write!(f, "219 {} {} :End of STATS report", client, stat) }
RplUModeIs221{ client, user_modes } => {
write!(f, "221 {} {}", client, user_modes) }
RplStatsUptime242{ client, seconds } => {
let day_time = seconds%(24*3600);
let hour = day_time/3600;
let minute = (day_time - hour*3600)/60;
let second = day_time%60;
write!(f, "242 {} :Server Up {} days {}:{:02}:{:02}", client,
seconds/(24*3600), hour, minute, second) }
RplLUserClient251{ client, users_num, inv_users_num, servers_num } => {
write!(f, "251 {} :There are {} users and {} invisible on {} servers",
client, users_num, inv_users_num, servers_num) }
RplLUserOp252{ client, ops_num } => {
write!(f, "252 {} {} :operator(s) online", client, ops_num) }
RplLUserUnknown253{ client, conns_num } => {
write!(f, "253 {} {} :unknown connection(s)", client, conns_num) }
RplLUserChannels254{ client, channels_num } => {
write!(f, "254 {} {} :channels formed", client, channels_num) }
RplLUserMe255{ client, clients_num, servers_num } => {
write!(f, "255 {} :I have {} clients and {} servers", client, clients_num,
servers_num) }
RplAdminMe256{ client, server } => {
write!(f, "256 {} {} :Administrative info", client, server) }
RplAdminLoc1257{ client, info } => {
write!(f, "257 {} :{}", client, info) }
RplAdminLoc2258{ client, info } => {
write!(f, "258 {} :{}", client, info) }
RplAdminEmail259{ client, email } => {
write!(f, "259 {} :{}", client, email) }
RplLocalUsers265{ client, clients_num, max_clients_num } => {
write!(f, "265 {} {} {} :Current local users {}, max {}", client,
clients_num, max_clients_num, clients_num, max_clients_num) }
RplGlobalUsers266{ client, clients_num, max_clients_num } => {
write!(f, "266 {} {} {} :Current global users {}, max {}", client,
clients_num, max_clients_num, clients_num, max_clients_num) }
RplAway301{ client, nick, message } => {
write!(f, "301 {} {} :{}", client, nick, message) }
RplUserHost302{ client, replies } => {
write!(f, "302 {} :{}", client, replies.iter()
.map(|x| x.to_string()).collect::<Vec::<_>>().join(" ")) }
RplIson303{ client, nicknames } => {
write!(f, "303 {} :{}", client, nicknames.iter()
.map(|x| x.to_string()).collect::<Vec::<_>>().join(" ")) }
RplUnAway305{ client } => {
write!(f, "305 {} :You are no longer marked as being away", client) }
RplNowAway306{ client } => {
write!(f, "306 {} :You have been marked as being away", client) }
RplWhoReply352{ client, channel, username, host, server, nick, flags,
hopcount, realname } => {
write!(f, "352 {} {} ~{} {} {} {} {} :{} {}", client, channel, username, host,
server, nick, flags, hopcount, realname) }
RplEndOfWho315{ client, mask } => {
write!(f, "315 {} {} :End of WHO list", client, mask) }
RplWhoIsRegNick307{ client, nick } => {
write!(f, "307 {} {} :has identified for this nick", client, nick) }
RplWhoIsUser311{ client, nick, username, host, realname } => {
write!(f, "311 {} {} ~{} {} * :{}", client, nick, username, host, realname) }
RplWhoIsServer312{ client, nick, server, server_info } => {
write!(f, "312 {} {} {} :{}", client, nick, server, server_info) }
RplWhoIsOperator313{ client, nick } => {
write!(f, "313 {} {} :is an IRC operator", client, nick) }
RplWhoWasUser314{ client, nick, username, host, realname } => {
write!(f, "314 {} {} ~{} {} * :{}", client, nick, username, host, realname) }
RplwhoIsIdle317{ client, nick, secs, signon } => {
write!(f, "317 {} {} {} {} :seconds idle, signon time",
client, nick, secs, signon) }
RplEndOfWhoIs318{ client, nick } => {
write!(f, "318 {} {} :End of /WHOIS list", client, nick) }
RplWhoIsChannels319{ client, nick, channels } => {
write!(f, "319 {} {} :{}", client, nick, channels.iter().map(|c| {
if let Some(ref prefix) = c.prefix {
prefix.to_string() + c.channel
} else { c.channel.to_string() }
}).collect::<Vec<_>>().join(" ")) }
RplListStart321{ client } => {
write!(f, "321 {} Channel :Users Name", client) }
RplList322{ client, channel, client_count, topic } => {
write!(f, "322 {} {} {} :{}", client, channel, client_count, topic) }
RplListEnd323{ client } => {
write!(f, "323 {} :End of /LIST", client) }
RplChannelModeIs324{ client, channel, modestring } => {
write!(f, "324 {} {} {}", client, channel, modestring) }
RplCreationTime329{ client, channel, creation_time } => {
write!(f, "329 {} {} {}", client, channel, creation_time) }
RplNoTopic331{ client, channel } => {
write!(f, "331 {} {} :No topic is set", client, channel) }
RplTopic332{ client, channel, topic } => {
write!(f, "332 {} {} :{}", client, channel, topic) }
RplTopicWhoTime333{ client, channel, nick, setat } => {
write!(f, "333 {} {} {} {}", client, channel, nick, setat) }
RplInviting341{ client, nick, channel } => {
write!(f, "341 {} {} {}", client, nick, channel) }
RplInviteList346{ client, channel, mask } => {
write!(f, "346 {} {} {}", client, channel, mask) }
RplEndOfInviteList347{ client, channel } => {
write!(f, "347 {} {} :End of channel invite list", client, channel) }
RplExceptList348{ client, channel, mask } => {
write!(f, "348 {} {} {}", client, channel, mask) }
RplEndOfExceptList349{ client, channel } => {
write!(f, "349 {} {} :End of channel exception list", client, channel) }
RplVersion351{ client, version, server, comments } => {
write!(f, "351 {} {} {} :{}", client, version, server, comments) }
RplNameReply353{ client, symbol, channel, replies } => {
write!(f, "353 {} {} {} :{}", client, symbol, channel,
replies.iter().map(|r| { r.prefix.to_string() + r.nick
}).collect::<Vec<_>>().join(" ")) }
RplLinks364{ client, server, mask, hop_count, server_info } => {
write!(f, "364 {} {} {} :{} {}", client, server, mask,
hop_count, server_info) }
RplEndOfLinks365{ client, mask } => {
write!(f, "365 {} {} :End of LINKS list", client, mask) },
RplEndOfNames366{ client, channel } => {
write!(f, "366 {} {} :End of /NAMES list", client, channel) }
RplBanList367{ client, channel, mask, who, set_ts } => {
write!(f, "367 {} {} {} {} {}", client, channel, mask, who, set_ts) }
RplEndOfBanList368{ client, channel } => {
write!(f, "368 {} {} :End of channel ban list", client, channel) }
RplEndOfWhoWas369{ client, nick } => {
write!(f, "369 {} {} :End of WHOWAS", client, nick) }
RplInfo371{ client, info } => {
write!(f, "371 {} :{}", client, info) }
RplEndOfInfo374{ client } => {
write!(f, "374 {} :End of INFO list", client) }
RplMotdStart375{ client, server } => {
write!(f, "375 {} :- {} Message of the day - ", client, server) }
RplMotd372{ client, motd } => {
write!(f, "372 {} :{}", client, motd) }
RplEndOfMotd376{ client } => {
write!(f, "376 {} :End of /MOTD command." , client) }
RplWhoIsHost378{ client, nick, host_info } => {
write!(f, "378 {} {} :is connecting from {}", client, nick, host_info) }
RplWhoIsModes379{ client, nick, modes } => {
write!(f, "379 {} {} :is using modes {}", client, nick, modes) }
RplYoureOper381{ client } => {
write!(f, "381 {} :You are now an IRC operator", client) }
RplTime391{ client, server, timestamp, ts_offset, human_readable } => {
write!(f, "391 {} {} {} {} :{}", client, server, timestamp, ts_offset,
human_readable) }
ErrUnknownError400{ client, command, subcommand, info } => {
if let Some(sc) = subcommand {
write!(f, "400 {} {} {} :{}", client, command, sc, info)
} else {
write!(f, "400 {} {} :{}", client, command, info)
} }
ErrNoSuchNick401{ client, nick } => {
write!(f, "401 {} {} :No such nick/channel", client, nick) }
ErrNoSuchChannel403{ client, channel } => {
write!(f, "403 {} {} :No such channel", client, channel) }
ErrCannotSendToChain404{ client, channel } => {
write!(f, "404 {} {} :Cannot send to channel", client, channel) }
ErrTooManyChannels405{ client, channel } => {
write!(f, "405 {} {} :You have joined too many channels", client, channel) }
ErrWasNoSuchNick406{ client, nick } => {
write!(f, "406 {} {} :There was no such nickname", client, nick) }
ErrInputTooLong417{ client } => {
write!(f, "417 {} :Input line was too long", client) }
ErrUnknownCommand421{ client, command } => {
write!(f, "421 {} {} :Unknown command", client, command) }
ErrNicknameInUse433{ client, nick } => {
write!(f, "433 {} {} :Nickname is already in use", client, nick) }
ErrUserNotInChannel441{ client, nick, channel } => {
write!(f, "441 {} {} {} :They aren't on that channel", client, nick, channel) }
ErrNotOnChannel442{ client, channel } => {
write!(f, "442 {} {} :You're not on that channel", client, channel) }
ErrUserOnChannel443{ client, nick, channel } => {
write!(f, "443 {} {} {} :is already on channel", client, nick, channel) }
ErrNotRegistered451{ client } => {
write!(f, "451 {} :You have not registered", client) }
ErrNeedMoreParams461{ client, command } => {
write!(f, "461 {} {} :Not enough parameters", client, command) }
ErrAlreadyRegistered462{ client } => {
write!(f, "462 {} :You may not reregister", client) }
ErrPasswdMismatch464{ client } => {
write!(f, "464 {} :Password incorrect", client) }
ErrChannelIsFull471{ client, channel } => {
write!(f, "471 {} {} :Cannot join channel (+l)", client, channel) }
ErrUnknownMode472{ client, modechar, channel } => {
write!(f, "472 {} {} :is unknown mode char for {}", client, modechar,
channel) }
ErrInviteOnlyChan473{ client, channel } => {
write!(f, "473 {} {} :Cannot join channel (+i)", client, channel) }
ErrBannedFromChan474{ client, channel } => {
write!(f, "474 {} {} :Cannot join channel (+b)", client, channel) }
ErrBadChannelKey475{ client, channel } => {
write!(f, "475 {} {} :Cannot join channel (+k)", client, channel) }
ErrNoPrivileges481{ client } => {
write!(f, "481 {} :Permission Denied- You're not an IRC operator", client) }
ErrChanOpPrivsNeeded482{ client, channel } => {
write!(f, "482 {} {} :You're not channel operator", client, channel) }
ErrCantKillServer483{ client } => {
write!(f, "483 {} :You cant kill a server!", client) }
ErrYourConnRestricted484{ client } => {
write!(f, "484 {} :Your connection is restricted!", client) }
ErrNoOperHost491{ client } => {
write!(f, "491 {} :No O-lines for your host", client) }
ErrUmodeUnknownFlag501{ client } => {
write!(f, "501 {} :Unknown MODE flag", client) }
ErrUsersDontMatch502{ client } => {
write!(f, "502 {} :Cant change mode for other users", client) }
ErrHelpNotFound524{ client, subject } => {
write!(f, "524 {} {} :No help available on this topic", client, subject) }
RplWhoIsSecure671{ client, nick } => {
write!(f, "671 {} {} :is using a secure connection", client, nick) }
ErrInvalidModeParam696{ client, target, modechar, param, description } => {
write!(f, "696 {} {} {} {} :{}", client, target, modechar,
param, description) }
RplHelpStart704{ client, subject, line } => {
write!(f, "704 {} {} :{}", client, subject, line) }
RplHelpTxt705{ client, subject, line } => {
write!(f, "705 {} {} :{}", client, subject, line) }
RplEndOfHelp706{ client, subject, line } => {
write!(f, "706 {} {} :{}", client, subject, line) }
ErrCannotDoCommand972{ client } => {
write!(f, "972 {} :Can not do command", client) }
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_replies() {
assert_eq!("001 <client> :Welcome to the <networkname> Network, <nick>!~<user>@<host>",
format!("{}", RplWelcome001{ client: "<client>", networkname: "<networkname>",
nick: "<nick>", user: "<user>", host: "<host>" }));
assert_eq!("002 <client> :Your host is <servername>, running version <version>",
format!("{}", RplYourHost002{ client: "<client>", servername: "<servername>",
version: "<version>" }));
assert_eq!("003 <client> :This server was created <datetime>",
format!("{}", RplCreated003{ client: "<client>", datetime: "<datetime>" }));
assert_eq!("004 <client> <servername> <version> <available user modes> \
<available channel modes> <channel modes with a parameter>",
format!("{}", RplMyInfo004{ client: "<client>", servername: "<servername>",
version: "<version>", avail_user_modes: "<available user modes>",
avail_chmodes: "<available channel modes>",
avail_chmodes_with_params: Some("<channel modes with a parameter>") }));
assert_eq!("004 <client> <servername> <version> <available user modes> \
<available channel modes>",
format!("{}", RplMyInfo004{ client: "<client>", servername: "<servername>",
version: "<version>", avail_user_modes: "<available user modes>",
avail_chmodes: "<available channel modes>",
avail_chmodes_with_params: None }));
assert_eq!("005 <client> <1-13 tokens> :are supported by this server",
format!("{}", RplISupport005{ client: "<client>", tokens: "<1-13 tokens>" }));
assert_eq!("212 <client> <command> 67",
format!("{}", RplStatsCommands212{ client: "<client>", command: "<command>",
count: 67 }));
assert_eq!("219 <client> u :End of STATS report",
format!("{}", RplEndOfStats219{ client: "<client>", stat: 'u' }));
assert_eq!("221 <client> <user modes>",
format!("{}", RplUModeIs221{ client: "<client>", user_modes: "<user modes>" }));
assert_eq!("242 <client> :Server Up 4120 days 21:34:49",
format!("{}", RplStatsUptime242{ client: "<client>", seconds: 356045689 }));
assert_eq!("251 <client> :There are 3 users and 4 invisible on 5 servers",
format!("{}", RplLUserClient251{ client: "<client>", users_num: 3,
inv_users_num: 4, servers_num: 5 }));
assert_eq!("252 <client> 6 :operator(s) online",
format!("{}", RplLUserOp252{ client: "<client>", ops_num: 6 }));
assert_eq!("253 <client> 7 :unknown connection(s)",
format!("{}", RplLUserUnknown253{ client: "<client>", conns_num: 7 }));
assert_eq!("254 <client> 8 :channels formed",
format!("{}", RplLUserChannels254{ client: "<client>", channels_num: 8 }));
assert_eq!("255 <client> :I have 3 clients and 6 servers",
format!("{}", RplLUserMe255{ client: "<client>", clients_num: 3,
servers_num: 6 }));
assert_eq!("256 <client> <server> :Administrative info",
format!("{}", RplAdminMe256{ client: "<client>", server: "<server>" }));
assert_eq!("257 <client> :<info>",
format!("{}", RplAdminLoc1257{ client: "<client>", info: "<info>" }));
assert_eq!("258 <client> :<info>",
format!("{}", RplAdminLoc2258{ client: "<client>", info: "<info>" }));
assert_eq!("259 <client> :<info>",
format!("{}", RplAdminEmail259{ client: "<client>", email: "<info>" }));
assert_eq!("265 <client> 4 7 :Current local users 4, max 7",
format!("{}", RplLocalUsers265{ client: "<client>", clients_num: 4,
max_clients_num: 7 }));
assert_eq!("266 <client> 7 10 :Current global users 7, max 10",
format!("{}", RplGlobalUsers266{ client: "<client>", clients_num: 7,
max_clients_num: 10 }));
assert_eq!("301 <client> <nick> :<message>",
format!("{}", RplAway301{ client: "<client>", nick: "<nick>",
message: "<message>" }));
assert_eq!("302 <client> :",
format!("{}", RplUserHost302{ client: "<client>", replies: &vec![] }));
assert_eq!("302 <client> :<reply1> <reply2> <reply3>",
format!("{}", RplUserHost302{ client: "<client>",
replies: &vec![ "<reply1>".to_string(), "<reply2>".to_string(),
"<reply3>".to_string()] }));
assert_eq!("303 <client> :<nick1> <nick2> <nick3>",
format!("{}", RplIson303{ client: "<client>",
nicknames: &vec![ "<nick1>", "<nick2>", "<nick3>"] }));
assert_eq!("305 <client> :You are no longer marked as being away",
format!("{}", RplUnAway305{ client: "<client>" }));
assert_eq!("306 <client> :You have been marked as being away",
format!("{}", RplNowAway306{ client: "<client>" }));
assert_eq!("352 <client> <channel> ~<username> <host> <server> <nick> \
<flags> :2 <realname>",
format!("{}", RplWhoReply352{ client: "<client>", channel: "<channel>",
username: "<username>", host: "<host>", server: "<server>", nick: "<nick>",
flags: "<flags>", hopcount: 2, realname: "<realname>" }));
assert_eq!("315 <client> <mask> :End of WHO list",
format!("{}", RplEndOfWho315{ client: "<client>", mask: "<mask>" }));
assert_eq!("307 <client> <nick> :has identified for this nick",
format!("{}", RplWhoIsRegNick307{ client: "<client>", nick: "<nick>" }));
assert_eq!("311 <client> <nick> ~<username> <host> * :<realname>",
format!("{}", RplWhoIsUser311{ client: "<client>", nick: "<nick>",
host: "<host>", username: "<username>", realname: "<realname>" }));
assert_eq!("312 <client> <nick> <server> :<server info>",
format!("{}", RplWhoIsServer312{ client: "<client>", nick: "<nick>",
server: "<server>", server_info: "<server info>" }));
assert_eq!("313 <client> <nick> :is an IRC operator",
format!("{}", RplWhoIsOperator313{ client: "<client>", nick: "<nick>" }));
assert_eq!("314 <client> <nick> ~<username> <host> * :<realname>",
format!("{}", RplWhoWasUser314{ client: "<client>", nick: "<nick>",
username: "<username>", host: "<host>", realname: "<realname>" }));
assert_eq!("317 <client> <nick> 134 548989343 :seconds idle, signon time",
format!("{}", RplwhoIsIdle317{ client: "<client>", nick: "<nick>",
secs: 134, signon: 548989343 }));
assert_eq!("318 <client> <nick> :End of /WHOIS list",
format!("{}", RplEndOfWhoIs318{ client: "<client>", nick: "<nick>" }));
assert_eq!("319 <client> <nick> :prefix1<channel1> <channel2> prefix3<channel3>",
format!("{}", RplWhoIsChannels319{ client: "<client>", nick: "<nick>",
channels: &vec![
WhoIsChannelStruct{ prefix: Some("prefix1".to_string()),
channel: "<channel1>" },
WhoIsChannelStruct{ prefix: None, channel: "<channel2>" },
WhoIsChannelStruct{ prefix: Some("prefix3".to_string()),
channel: "<channel3>" }]}));
assert_eq!("321 <client> Channel :Users Name",
format!("{}", RplListStart321{ client: "<client>" }));
assert_eq!("322 <client> <channel> 47 :<topic>",
format!("{}", RplList322{ client: "<client>", channel: "<channel>",
client_count: 47, topic: "<topic>" }));
assert_eq!("323 <client> :End of /LIST",
format!("{}", RplListEnd323{ client: "<client>" }));
assert_eq!("324 <client> <channel> <modestring>",
format!("{}", RplChannelModeIs324{ client: "<client>", channel: "<channel>",
modestring: "<modestring>" }));
assert_eq!("329 <client> <channel> 334411111",
format!("{}", RplCreationTime329{ client: "<client>", channel: "<channel>",
creation_time: 334411111 }));
assert_eq!("331 <client> <channel> :No topic is set",
format!("{}", RplNoTopic331{ client: "<client>", channel: "<channel>" }));
assert_eq!("332 <client> <channel> :<topic>",
format!("{}", RplTopic332{ client: "<client>", channel: "<channel>",
topic: "<topic>" }));
assert_eq!("333 <client> <channel> <nick> 38329311",
format!("{}", RplTopicWhoTime333{ client: "<client>", channel: "<channel>",
nick: "<nick>", setat: 38329311 }));
assert_eq!("341 <client> <nick> <channel>",
format!("{}", RplInviting341{ client: "<client>", nick: "<nick>",
channel: "<channel>" }));
assert_eq!("346 <client> <channel> <mask>",
format!("{}", RplInviteList346{ client: "<client>", channel: "<channel>",
mask: "<mask>" }));
assert_eq!("347 <client> <channel> :End of channel invite list",
format!("{}", RplEndOfInviteList347{ client: "<client>",
channel: "<channel>" }));
assert_eq!("348 <client> <channel> <mask>",
format!("{}", RplExceptList348{ client: "<client>", channel: "<channel>",
mask: "<mask>" }));
assert_eq!("349 <client> <channel> :End of channel exception list",
format!("{}", RplEndOfExceptList349{ client: "<client>",
channel: "<channel>" }));
assert_eq!("351 <client> <version> <server> :<comments>",
format!("{}", RplVersion351{ client: "<client>", version: "<version>",
server: "<server>", comments: "<comments>" }));
assert_eq!("353 <client> <symbol> <channel> :<prefix1><nick1> <nick2>",
format!("{}", RplNameReply353{ client: "<client>", symbol: "<symbol>",
channel: "<channel>", replies: &vec![
NameReplyStruct{ prefix: "<prefix1>".to_string(), nick: "<nick1>" },
NameReplyStruct{ prefix: String::new(), nick: "<nick2>" }] }));
assert_eq!("364 <client> <server> <mask> :1 <server_info>",
format!("{}", RplLinks364{ client: "<client>",
server: "<server>", mask: "<mask>", hop_count: 1,
server_info: "<server_info>" }));
assert_eq!("365 <client> <mask> :End of LINKS list",
format!("{}", RplEndOfLinks365{ client: "<client>", mask: "<mask>" }));
assert_eq!("366 <client> <channel> :End of /NAMES list",
format!("{}", RplEndOfNames366{ client: "<client>", channel: "<channel>" }));
assert_eq!("367 <client> <channel> <mask> <who> 3894211355",
format!("{}", RplBanList367{ client: "<client>", channel: "<channel>",
mask: "<mask>", who: "<who>", set_ts: 3894211355 }));
assert_eq!("368 <client> <channel> :End of channel ban list",
format!("{}", RplEndOfBanList368{ client: "<client>", channel: "<channel>" }));
assert_eq!("369 <client> <nick> :End of WHOWAS",
format!("{}", RplEndOfWhoWas369{ client: "<client>", nick: "<nick>" }));
assert_eq!("371 <client> :<info>",
format!("{}", RplInfo371{ client: "<client>", info: "<info>" }));
assert_eq!("374 <client> :End of INFO list",
format!("{}", RplEndOfInfo374{ client: "<client>" }));
assert_eq!("375 <client> :- <server> Message of the day - ",
format!("{}", RplMotdStart375{ client: "<client>", server: "<server>" }));
assert_eq!("372 <client> :<motd>",
format!("{}", RplMotd372{ client: "<client>", motd: "<motd>" }));
assert_eq!("376 <client> :End of /MOTD command.",
format!("{}", RplEndOfMotd376{ client: "<client>" }));
assert_eq!("378 <client> <nick> :is connecting from *@localhost 127.0.0.1",
format!("{}", RplWhoIsHost378{ client: "<client>", nick: "<nick>",
host_info: "*@localhost 127.0.0.1" }));
assert_eq!("379 <client> <nick> :is using modes +ailosw",
format!("{}", RplWhoIsModes379{ client: "<client>", nick: "<nick>",
modes: "+ailosw" }));
assert_eq!("381 <client> :You are now an IRC operator",
format!("{}", RplYoureOper381{ client: "<client>" }));
assert_eq!("391 <client> <server> 485829211 <TS offset> :<human-readable time>",
format!("{}", RplTime391{ client: "<client>", server: "<server>",
timestamp: 485829211, ts_offset: "<TS offset>",
human_readable: "<human-readable time>" }));
assert_eq!("400 <client> <command> :<info>",
format!("{}", ErrUnknownError400{ client: "<client>", command: "<command>",
subcommand: None, info: "<info>" }));
assert_eq!("400 <client> <command> <subcommand> :<info>",
format!("{}", ErrUnknownError400{ client: "<client>", command: "<command>",
subcommand: Some("<subcommand>"), info: "<info>" }));
assert_eq!("401 <client> <nickname> :No such nick/channel",
format!("{}", ErrNoSuchNick401{ client: "<client>", nick: "<nickname>" }));
assert_eq!("403 <client> <channel> :No such channel",
format!("{}", ErrNoSuchChannel403{ client: "<client>", channel: "<channel>" }));
assert_eq!("404 <client> <channel> :Cannot send to channel",
format!("{}", ErrCannotSendToChain404{ client: "<client>",
channel: "<channel>" }));
assert_eq!("405 <client> <channel> :You have joined too many channels",
format!("{}", ErrTooManyChannels405{ client: "<client>",
channel: "<channel>" }));
assert_eq!("406 <client> <nickname> :There was no such nickname",
format!("{}", ErrWasNoSuchNick406{ client: "<client>", nick: "<nickname>" }));
assert_eq!("417 <client> :Input line was too long",
format!("{}", ErrInputTooLong417{ client: "<client>" }));
assert_eq!("421 <client> <command> :Unknown command",
format!("{}", ErrUnknownCommand421{ client: "<client>",
command: "<command>" }));
assert_eq!("433 <client> <nick> :Nickname is already in use",
format!("{}", ErrNicknameInUse433{ client: "<client>", nick: "<nick>" }));
assert_eq!("441 <client> <nick> <channel> :They aren't on that channel",
format!("{}", ErrUserNotInChannel441{ client: "<client>", nick: "<nick>",
channel: "<channel>" }));
assert_eq!("442 <client> <channel> :You're not on that channel",
format!("{}", ErrNotOnChannel442{ client: "<client>", channel: "<channel>" }));
assert_eq!("443 <client> <nick> <channel> :is already on channel",
format!("{}", ErrUserOnChannel443{ client: "<client>", nick: "<nick>",
channel: "<channel>" }));
assert_eq!("451 <client> :You have not registered",
format!("{}", ErrNotRegistered451{ client: "<client>" }));
assert_eq!("461 <client> <command> :Not enough parameters",
format!("{}", ErrNeedMoreParams461{ client: "<client>",command: "<command>" }));
assert_eq!("462 <client> :You may not reregister",
format!("{}", ErrAlreadyRegistered462{ client: "<client>" }));
assert_eq!("464 <client> :Password incorrect",
format!("{}", ErrPasswdMismatch464{ client: "<client>" }));
assert_eq!("471 <client> <channel> :Cannot join channel (+l)",
format!("{}", ErrChannelIsFull471{ client: "<client>", channel: "<channel>" }));
assert_eq!("472 <client> x :is unknown mode char for <channel>",
format!("{}", ErrUnknownMode472{ client: "<client>", modechar: 'x',
channel: "<channel>" }));
assert_eq!("473 <client> <channel> :Cannot join channel (+i)",
format!("{}", ErrInviteOnlyChan473{ client: "<client>", channel: "<channel>" }));
assert_eq!("474 <client> <channel> :Cannot join channel (+b)",
format!("{}", ErrBannedFromChan474{ client: "<client>", channel: "<channel>" }));
assert_eq!("475 <client> <channel> :Cannot join channel (+k)",
format!("{}", ErrBadChannelKey475{ client: "<client>", channel: "<channel>" }));
assert_eq!("481 <client> :Permission Denied- You're not an IRC operator",
format!("{}", ErrNoPrivileges481{ client: "<client>" }));
assert_eq!("482 <client> <channel> :You're not channel operator",
format!("{}", ErrChanOpPrivsNeeded482{ client: "<client>",
channel: "<channel>" }));
assert_eq!("483 <client> :You cant kill a server!",
format!("{}", ErrCantKillServer483{ client: "<client>" }));
assert_eq!("484 <client> :Your connection is restricted!",
format!("{}", ErrYourConnRestricted484{ client: "<client>" }));
assert_eq!("491 <client> :No O-lines for your host",
format!("{}", ErrNoOperHost491{ client: "<client>" }));
assert_eq!("501 <client> :Unknown MODE flag",
format!("{}", ErrUmodeUnknownFlag501{ client: "<client>" }));
assert_eq!("502 <client> :Cant change mode for other users",
format!("{}", ErrUsersDontMatch502{ client: "<client>" }));
assert_eq!("524 <client> <subject> :No help available on this topic",
format!("{}", ErrHelpNotFound524{ client: "<client>", subject: "<subject>" }));
assert_eq!("696 <client> <target chan/user> x <parameter> :<description>",
format!("{}", ErrInvalidModeParam696{ client: "<client>",
target: "<target chan/user>", modechar: 'x', param: "<parameter>",
description: "<description>" }));
assert_eq!("704 <client> <subject> :<first line of help section>",
format!("{}", RplHelpStart704{ client: "<client>", subject: "<subject>",
line: "<first line of help section>" }));
assert_eq!("705 <client> <subject> :<line of help text>",
format!("{}", RplHelpTxt705{ client: "<client>", subject: "<subject>",
line: "<line of help text>" }));
assert_eq!("706 <client> <subject> :<last line of help text>",
format!("{}", RplEndOfHelp706{ client: "<client>", subject: "<subject>",
line: "<last line of help text>" }));
assert_eq!("972 <client> :Can not do command",
format!("{}", ErrCannotDoCommand972{ client: "<client>" }));
}
}