aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Dremann <dremann@gmail.com>2014-06-09 22:49:14 -0400
committerZachary Dremann <dremann@gmail.com>2014-06-09 22:49:14 -0400
commitc1c93595f0d532ed169537d1b52168288e989f2c (patch)
treecaa81fa35eb4015c3eb1094a4af67a20fc0196cf
parent6eac9deb6231ee345d2d19f54761a4820f0c345b (diff)
downloadrusty-irc-c1c93595f0d532ed169537d1b52168288e989f2c.tar.gz
rusty-irc-c1c93595f0d532ed169537d1b52168288e989f2c.zip
Better Message Parsing
-rw-r--r--examples/client.rs2
-rw-r--r--src/msg.rs65
2 files changed, 29 insertions, 38 deletions
diff --git a/examples/client.rs b/examples/client.rs
index d37bb40..ba8c1de 100644
--- a/examples/client.rs
+++ b/examples/client.rs
@@ -17,7 +17,7 @@ fn main() {
drop(args);
- let mut connection = IrcClient::connect(host.as_slice(), port, "Dr-Emann".to_string(), "dremann".to_string(), "Zachary Dremann".to_string()).unwrap();
+ let mut connection = IrcClient::connect(host.as_slice(), port, "rusty-irc".to_string(), "dremann".to_string(), "Zachary Dremann".to_string()).unwrap();
let on_msg = |message: &Message| {
println!("{}", *message);
diff --git a/src/msg.rs b/src/msg.rs
index 3471d75..8db6077 100644
--- a/src/msg.rs
+++ b/src/msg.rs
@@ -138,48 +138,39 @@ impl FromStr for Message {
args.push(current_str.take_unwrap());
let cmd = match cmd.map(|s| s.into_ascii_upper()).as_ref().map(|s| s.as_slice()) {
- Some("NICK") => {
- if args.len() == 1 { Some(cmd::Nick(args.pop().unwrap())) }
- else { None }
- }
- Some("USER") => {
- if args.len() == 4 {
- let mut iter = args.move_iter();
- let uname = iter.next().unwrap();
- let opt_mode: Option<u8> = from_str(iter.next().unwrap().as_slice());
- iter.next();
- let fullname = iter.next().unwrap();
- if opt_mode.is_some() {
- Some(cmd::User(uname, opt_mode.unwrap(), fullname))
+ Some(s) => {
+ match s {
+ "NICK" if args.len() == 1 => cmd::Nick(args.pop().unwrap()),
+ "USER" if args.len() == 4 => {
+ let mut iter = args.move_iter();
+ let uname = iter.next().unwrap();
+ let opt_mode: Option<u8> = from_str(iter.next().unwrap().as_slice());
+ iter.next();
+ let fullname = iter.next().unwrap();
+ cmd::User(uname, opt_mode.unwrap_or(0), fullname)
}
- else {
- None
+ "NOTICE" if args.len() == 2 => {
+ let mut iter = args.move_iter();
+ cmd::Notice(iter.next().unwrap(), iter.next().unwrap())
+ }
+ "PRIVMSG" if args.len() == 2 => {
+ let mut iter = args.move_iter();
+ cmd::PrivMsg(iter.next().unwrap(), iter.next().unwrap())
+ }
+ "PING" if args.len() == 1 => cmd::Ping(args.pop().unwrap()),
+ "PONG" if args.len() == 1 => cmd::Pong(args.pop().unwrap()),
+ "AWAY" if args.len() == 0 || args.len() == 1 => cmd::Away(args.pop()),
+ other => {
+ match from_str::<u16>(other) {
+ Some(n) if args.len() == 0 || args.len() == 1 => cmd::Numeric(n, args.pop()),
+ _ => cmd::UnknownCmd(s.to_string(), args)
+ }
}
}
- else { None }
- }
- Some("NOTICE") => {
- if args.len() == 2 {
- let mut iter = args.move_iter();
- Some(cmd::Notice(iter.next().unwrap(), iter.next().unwrap()))
- }
- else { None }
- }
- Some("PRIVMSG") => {
- if args.len() == 2 {
- let mut iter = args.move_iter();
- Some(cmd::PrivMsg(iter.next().unwrap(), iter.next().unwrap()))
- }
- else { None }
- }
- Some(other) => {
- Some(cmd::UnknownCmd(other.to_string(), args))
- }
- None => {
- None
}
+ None => cmd::UnknownCmd(String::new(), args)
};
- cmd.map(|c| Message { prefix: prefix.take(), command: c })
+ Some(Message { prefix: prefix, command: cmd })
}
}