Implemented ServerIterator and message parsing.
This commit is contained in:
parent
6da40f2ad3
commit
d97035cca9
2 changed files with 50 additions and 0 deletions
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()[])
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue