aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Dremann <dremann@gmail.com>2014-06-13 12:21:28 -0400
committerZachary Dremann <dremann@gmail.com>2014-06-13 12:21:28 -0400
commit0a3f5acd4df4a48b10c4f0d63ea4a7070c39c0b5 (patch)
treeefbbf91745a9682e1f4118cd086d302d4dd7e1fe
parent76f65af3a8b3956d019cac5de6d32a724f760c0f (diff)
downloadrusty-irc-0a3f5acd4df4a48b10c4f0d63ea4a7070c39c0b5.tar.gz
rusty-irc-0a3f5acd4df4a48b10c4f0d63ea4a7070c39c0b5.zip
Allow multiple arguments for a numeric command
-rw-r--r--src/msg.rs29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/msg.rs b/src/msg.rs
index 7bc03ca..f84748d 100644
--- a/src/msg.rs
+++ b/src/msg.rs
@@ -17,7 +17,7 @@ pub mod cmd {
Pong(String),
Error(String),
Away(Option<String>),
- Numeric(u16, String, Option<String>),
+ Numeric(u16, String, Vec<String>),
UnknownCmd(String, Vec<String>)
}
}
@@ -63,8 +63,27 @@ impl fmt::Show for Message {
cmd::Pong(ref msg) => write!(formatter, "PONG :{}", msg),
cmd::Error(ref msg) => write!(formatter, "ERROR :{}", msg),
cmd::Away(ref msg) => if msg.is_some() { write!(formatter, "AWAY :{}", msg.get_ref()) } else { write!(formatter, "AWAY") },
- cmd::Numeric(i, ref target, ref msg) => if msg.is_some() { write!(formatter, "{:03u} {} :{}", i, target, msg.get_ref()) } else { write!(formatter, "{:03u} {}", i, target) },
cmd::Motd(ref target) => if target.is_some() { write!(formatter, "MOTD :{}", target.get_ref()) } else { write!(formatter, "MOTD") },
+ cmd::Numeric(i, ref target, ref args) => {
+ try!(write!(formatter, "{:03u} {}", i, target));
+ let mut iter = args.iter().peekable();
+ loop {
+ match iter.next() {
+ Some(arg) => {
+ try!(
+ if iter.peek().is_some() {
+ write!(formatter, " {}", arg)
+ }
+ else {
+ write!(formatter, " :{}", arg)
+ }
+ );
+ }
+ None => break
+ }
+ }
+ Ok(())
+ }
cmd::UnknownCmd(ref cmd, ref args) => {
try!(write!(formatter, "{}", cmd));
let mut iter = args.iter().peekable();
@@ -214,9 +233,9 @@ impl FromStr for Message {
"MOTD" if args.len() == 0 || args.len() == 1 => cmd::Motd(args.pop()),
other => {
match from_str::<u16>(other) {
- Some(n) if args.len() == 1 || args.len() == 2 => {
- let mut iter = args.move_iter();
- cmd::Numeric(n, iter.next().unwrap(), iter.next())
+ Some(n) if args.len() > 0 => {
+ let target = args.shift().unwrap();
+ cmd::Numeric(n, target, args)
}
_ => cmd::UnknownCmd(s.to_string(), args)
}