Implemented ServerIterator and message parsing.

This commit is contained in:
Aaron Weiss 2014-11-02 18:08:56 -05:00
parent 6da40f2ad3
commit d97035cca9
2 changed files with 50 additions and 0 deletions

View file

@ -1,3 +1,5 @@
use std::from_str::FromStr;
#[deriving(Clone, PartialEq, Show)]
pub struct Message {
pub prefix: Option<String>,
@ -36,3 +38,32 @@ impl Message {
ret
}
}
impl FromStr for Message {
fn from_str(s: &str) -> Option<Message> {
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))
}
}

View file

@ -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<T, U>
}
pub struct ServerIterator<'a, T, U> where T: IrcWriter, U: IrcReader {
pub server: &'a IrcServer<'a, T, U>
}
impl<'a, T, U> Iterator<Message> for ServerIterator<'a, T, U> where T: IrcWriter, U: IrcReader {
fn next(&mut self) -> Option<Message> {
let line = self.server.conn.recv();
if let Err(_) = line { return None }
from_str(line.unwrap()[])
}
}