Added Server trait and implemented basic Server functionality for IrcServer.

This commit is contained in:
Aaron Weiss 2014-11-02 18:39:00 -05:00
parent 4df7be1662
commit 2e2d411907
2 changed files with 49 additions and 3 deletions

View file

@ -23,9 +23,9 @@ impl<T, U> Connection<T, U> where T: IrcWriter, U: IrcReader {
} }
} }
pub fn send(&self, msg: Message) -> IoResult<()> { pub fn send(&self, message: Message) -> IoResult<()> {
let mut send = self.writer.lock(); let mut send = self.writer.lock();
try!(send.write_str(msg.into_string()[])); try!(send.write_str(message.into_string()[]));
send.flush() send.flush()
} }

View file

@ -1,15 +1,61 @@
use std::io::{BufferedReader, BufferedWriter, IoResult, TcpStream};
use conn::Connection; use conn::Connection;
use data::config::Config;
use data::kinds::{IrcReader, IrcWriter}; use data::kinds::{IrcReader, IrcWriter};
use data::message::Message; use data::message::Message;
pub trait Server<'a, T, U> {
fn send(&self, _: Message) -> IoResult<()>;
fn iter(&'a self) -> ServerIterator<'a, T, U>;
}
pub struct IrcServer<'a, T, U> where T: IrcWriter, U: IrcReader { pub struct IrcServer<'a, T, U> where T: IrcWriter, U: IrcReader {
pub conn: Connection<T, U> pub conn: Connection<T, U>,
pub config: Config
}
impl<'a> IrcServer<'a, BufferedWriter<TcpStream>, BufferedReader<TcpStream>> {
pub fn new(config: &str) -> IoResult<IrcServer<'a, BufferedWriter<TcpStream>, BufferedReader<TcpStream>>> {
let config = try!(Config::load_utf8(config));
let conn = try!(Connection::connect(config.server[], config.port));
Ok(IrcServer {
conn: conn,
config: config
})
}
}
impl<'a, T, U> Server<'a, T, U> for IrcServer<'a, T, U> where T: IrcWriter, U: IrcReader{
fn send(&self, message: Message) -> IoResult<()> {
self.conn.send(message)
}
fn iter(&'a self) -> ServerIterator<'a, T, U> {
ServerIterator::new(self)
}
}
impl<'a, T, U> IrcServer<'a, T, U> where T: IrcWriter, U: IrcReader {
pub fn from_connection(config: &str, conn: Connection<T, U>) -> IoResult<IrcServer<'a, T, U>> {
Ok(IrcServer {
conn: conn,
config: try!(Config::load_utf8(config))
})
}
} }
pub struct ServerIterator<'a, T, U> where T: IrcWriter, U: IrcReader { pub struct ServerIterator<'a, T, U> where T: IrcWriter, U: IrcReader {
pub server: &'a IrcServer<'a, T, U> pub server: &'a IrcServer<'a, T, U>
} }
impl<'a, T, U> ServerIterator<'a, T, U> where T: IrcWriter, U: IrcReader {
pub fn new(server: &'a IrcServer<'a, T, U>) -> ServerIterator<'a, T, U> {
ServerIterator {
server: server
}
}
}
impl<'a, T, U> Iterator<Message> for ServerIterator<'a, T, U> where T: IrcWriter, U: IrcReader { impl<'a, T, U> Iterator<Message> for ServerIterator<'a, T, U> where T: IrcWriter, U: IrcReader {
fn next(&mut self) -> Option<Message> { fn next(&mut self) -> Option<Message> {
let line = self.server.conn.recv(); let line = self.server.conn.recv();