From d97035cca9527ee6b53e31c2c59c6650096b982d Mon Sep 17 00:00:00 2001 From: Aaron Weiss Date: Sun, 2 Nov 2014 18:08:56 -0500 Subject: [PATCH] Implemented ServerIterator and message parsing. --- src/data/message.rs | 31 +++++++++++++++++++++++++++++++ src/server.rs | 19 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/data/message.rs b/src/data/message.rs index fd3ed90..9665cd5 100644 --- a/src/data/message.rs +++ b/src/data/message.rs @@ -1,3 +1,5 @@ +use std::from_str::FromStr; + #[deriving(Clone, PartialEq, Show)] pub struct Message { pub prefix: Option, @@ -36,3 +38,32 @@ impl Message { ret } } + +impl FromStr for Message { + fn from_str(s: &str) -> Option { + let mut state = s.clone(); + if s.len() == 0 { return None } + let prefix = if state.starts_with(":") { + let prefix = state.find(' ').map(|i| s[1..i]); + state = state.find(' ').map_or("", |i| s[i..]); + prefix + } else { + None + }; + let suffix = if state.contains(":") { + let suffix = state.find(':').map(|i| s[i..]); + state = state.find(':').map_or("", |i| s[..i]); + suffix + } else { + None + }; + let command = if let Some(cmd) = state.find(' ').map(|i| s[..i]) { + state = state.find(' ').map_or("", |i| s[i..]); + cmd + } else { + return None + }; + let args: Vec<_> = state.splitn(14, ' ').collect(); + Some(Message::new(prefix, command, if args.len() > 0 { Some(args) } else { None }, suffix)) + } +} diff --git a/src/server.rs b/src/server.rs index e69de29..95c3905 100644 --- a/src/server.rs +++ b/src/server.rs @@ -0,0 +1,19 @@ +use conn::Connection; +use data::kinds::{IrcReader, IrcWriter}; +use data::message::Message; + +pub struct IrcServer<'a, T, U> where T: IrcWriter, U: IrcReader { + pub conn: Connection +} + +pub struct ServerIterator<'a, T, U> where T: IrcWriter, U: IrcReader { + pub server: &'a IrcServer<'a, T, U> +} + +impl<'a, T, U> Iterator for ServerIterator<'a, T, U> where T: IrcWriter, U: IrcReader { + fn next(&mut self) -> Option { + let line = self.server.conn.recv(); + if let Err(_) = line { return None } + from_str(line.unwrap()[]) + } +}