diff options
author | Till Hoeppner | 2015-04-16 23:32:00 +0200 |
---|---|---|
committer | Till Hoeppner | 2015-04-16 23:32:00 +0200 |
commit | cd182daf35eae3739511f3751843ad01f0d489b3 (patch) | |
tree | 1ce4274d6107b2fe5c87f71437fd9aa988cf090b /src | |
parent | 8bf21091210af570a74a29eb731a867c0788ebdb (diff) | |
download | ilc-cd182daf35eae3739511f3751843ad01f0d489b3.tar.gz ilc-cd182daf35eae3739511f3751843ad01f0d489b3.tar.xz ilc-cd182daf35eae3739511f3751843ad01f0d489b3.zip |
Add untested support for binary serialization with rustc_serialize and bincode
Diffstat (limited to 'src')
-rw-r--r-- | src/format/binary.rs | 33 | ||||
-rw-r--r-- | src/format/mod.rs | 3 | ||||
-rw-r--r-- | src/format/weechat3.rs | 2 | ||||
-rw-r--r-- | src/lib.rs | 6 | ||||
-rw-r--r-- | src/log.rs | 2 |
5 files changed, 42 insertions, 4 deletions
diff --git a/src/format/binary.rs b/src/format/binary.rs new file mode 100644 index 0000000..aae760c --- /dev/null +++ b/src/format/binary.rs @@ -0,0 +1,33 @@ +use std::io::{ self, BufRead, Write }; +use std::borrow::ToOwned; +use std::iter::{ Iterator }; + +use log::Event; +use format::{ Encode, Decode }; + +use bincode::{ self, SizeLimit }; + +pub struct Binary; + +pub struct Iter<R> where R: BufRead { + input: R, +} + +impl<R> Iterator for Iter<R> where R: BufRead { + type Item = ::Result<Event>; + fn next(&mut self) -> Option<::Result<Event>> { + Some(bincode::decode_from(&mut self.input, SizeLimit::Infinite).map_err(|_| ::IlcError::BincodeDecode)) + } +} + +impl<W> Encode<W> for Binary where W: Write { + fn encode(&self, mut output: W, event: &Event) -> ::Result<()> { + bincode::encode_into(event, &mut output, SizeLimit::Infinite).map_err(|_| ::IlcError::BincodeEncode) + } +} + +impl<R> Decode<R, Iter<R>> for Binary where R: BufRead { + fn decode(&mut self, input: R) -> Iter<R> { + Iter { input: input } + } +} diff --git a/src/format/mod.rs b/src/format/mod.rs index 9f6d30d..2c271bd 100644 --- a/src/format/mod.rs +++ b/src/format/mod.rs @@ -7,9 +7,10 @@ use std::io::{ self, BufRead, Write }; use log::Event; pub mod weechat3; +pub mod binary; pub trait Encode<W> where W: Write { - fn encode(&self, output: W, event: &Event) -> io::Result<()>; + fn encode(&self, output: W, event: &Event) -> ::Result<()>; } pub trait Decode<R, O> where R: BufRead, O: Iterator<Item = ::Result<Event>> { diff --git a/src/format/weechat3.rs b/src/format/weechat3.rs index 0904ced..59bb072 100644 --- a/src/format/weechat3.rs +++ b/src/format/weechat3.rs @@ -95,7 +95,7 @@ impl<R> Decode<R, Iter<R>> for Weechat3 where R: BufRead { } impl<W> Encode<W> for Weechat3 where W: Write { - fn encode(&self, mut output: W, event: &Event) -> io::Result<()> { + fn encode(&self, mut output: W, event: &Event) -> ::Result<()> { fn date(t: i64) -> String { format!("{}", UTC.timestamp(t, 0).format(TIME_DATE_FORMAT)) } @@ -1,9 +1,11 @@ -#![feature(plugin, slice_patterns, core)] +#![feature(plugin, slice_patterns, core, custom_derive)] #![plugin(regex_macros)] extern crate regex; extern crate chrono; #[macro_use] extern crate log as l; +extern crate rustc_serialize; +extern crate bincode; pub mod log; pub mod format; @@ -19,6 +21,8 @@ pub type Result<T> = result::Result<T, IlcError>; pub enum IlcError { Parse(String), Chrono(ParseError), + BincodeDecode, + BincodeEncode, Io(io::Error) } @@ -9,7 +9,7 @@ pub struct Log { /// All representable events, such as messages, quits, joins /// and topic changes. -#[derive(Debug)] +#[derive(Debug, RustcEncodable, RustcDecodable)] pub enum Event { Connect { time: i64 |