From a4dcf4b1d4586055e949062a5f5be141007ef58c Mon Sep 17 00:00:00 2001 From: Zachary Dremann Date: Tue, 10 Jun 2014 01:16:45 -0400 Subject: Updated --- examples/client.rs | 16 ++++++++++++++++ src/lib.rs | 4 ++++ src/msg.rs | 16 ++++++++++++---- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/examples/client.rs b/examples/client.rs index ba8c1de..c2dc89f 100644 --- a/examples/client.rs +++ b/examples/client.rs @@ -18,10 +18,26 @@ fn main() { drop(args); let mut connection = IrcClient::connect(host.as_slice(), port, "rusty-irc".to_string(), "dremann".to_string(), "Zachary Dremann".to_string()).unwrap(); + let sender = connection.sender(); let on_msg = |message: &Message| { println!("{}", *message); }; + + spawn(proc() { + let mut stdin = stdio::stdin(); + for line in stdin.lines() { + match line { + Ok(s) => { + match from_str(s.as_slice()) { + Some(msg) => sender.send(msg), + None => () + } + } + Err(_) => break, + } + } + }); connection.run_loop(on_msg); } diff --git a/src/lib.rs b/src/lib.rs index c367185..3898480 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -46,6 +46,10 @@ impl IrcClient { self.output_sender.send(message); } + pub fn sender(&self) -> Sender { + self.output_sender.clone() + } + fn on_msg_rec(msg: &Message, sender: &Sender) { let _prefix = &msg.prefix; let cmd = &msg.command; diff --git a/src/msg.rs b/src/msg.rs index 8db6077..0d2daaa 100644 --- a/src/msg.rs +++ b/src/msg.rs @@ -17,7 +17,7 @@ pub mod cmd { Pong(String), Error(String), Away(Option), - Numeric(u16, Option), + Numeric(u16, String, Option), UnknownCmd(String, Vec) } } @@ -66,7 +66,7 @@ impl<'a> 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 msg) => if msg.is_some() { write!(formatter, "{:03u} :{}", i, msg.get_ref()) } else { write!(formatter, "{:03u}", i) }, + 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::UnknownCmd(ref cmd, ref args) => { try!(write!(formatter, "{}", cmd)); let mut iter = args.iter().peekable(); @@ -135,7 +135,12 @@ impl FromStr for Message { } } - args.push(current_str.take_unwrap()); + if cmd.is_none() { + cmd = current_str.take(); + } + else { + args.push(current_str.take_unwrap()); + } let cmd = match cmd.map(|s| s.into_ascii_upper()).as_ref().map(|s| s.as_slice()) { Some(s) => { @@ -162,7 +167,10 @@ impl FromStr for Message { "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()), + Some(n) if args.len() == 1 || args.len() == 2 => { + let mut iter = args.move_iter(); + cmd::Numeric(n, iter.next().unwrap(), iter.next()) + } _ => cmd::UnknownCmd(s.to_string(), args) } } -- cgit v1.2.3