aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTill Hoeppner2015-04-16 23:32:00 +0200
committerTill Hoeppner2015-04-16 23:32:00 +0200
commitcd182daf35eae3739511f3751843ad01f0d489b3 (patch)
tree1ce4274d6107b2fe5c87f71437fd9aa988cf090b /src
parent8bf21091210af570a74a29eb731a867c0788ebdb (diff)
downloadilc-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.rs33
-rw-r--r--src/format/mod.rs3
-rw-r--r--src/format/weechat3.rs2
-rw-r--r--src/lib.rs6
-rw-r--r--src/log.rs2
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))
}
diff --git a/src/lib.rs b/src/lib.rs
index a160e4b..aabaae3 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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)
}
diff --git a/src/log.rs b/src/log.rs
index b15d128..c0faaae 100644
--- a/src/log.rs
+++ b/src/log.rs
@@ -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