From c1c93595f0d532ed169537d1b52168288e989f2c Mon Sep 17 00:00:00 2001 From: Zachary Dremann Date: Mon, 9 Jun 2014 22:49:14 -0400 Subject: Better Message Parsing --- examples/client.rs | 2 +- src/msg.rs | 65 +++++++++++++++++++++++------------------------------- 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 = 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 = 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::(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 }) } } -- cgit v1.2.3