#![crate_name = "bincode"] #![crate_type = "rlib"] #![crate_type = "dylib"] #![feature(struct_variant)] extern crate serialize; use std::io::Buffer; use std::io::MemWriter; use std::io::MemReader; use std::io::IoError; use std::io::IoResult; use serialize::Encodable; use serialize::Decodable; pub use writer::EncoderWriter; pub use reader::DecoderReader; mod writer; mod reader; pub fn encode<'a, T: Encodable, IoError>>(t: &T) ->IoResult> { let mut w = MemWriter::new(); match encode_into(t, &mut w) { Ok(()) => Ok(w.unwrap()), Err(e) => Err(e) } } pub fn decode<'a, T: Decodable, IoError>>(b: Vec) -> IoResult { decode_from(&mut MemReader::new(b)) } // In order to be able to pass MemReaders/MemWriters by reference, I borrowed the method used in // the current json encoder in the stdlib // TODO: Make code safe https://github.com/rust-lang/rust/issues/14302 pub fn encode_into<'a, W: 'a+Writer, T: Encodable, IoError>>(t: &T, w: &mut W) -> IoResult<()> { unsafe { t.encode(std::mem::transmute(&mut writer::EncoderWriter::new(w))) } } // TODO: Make code safe https://github.com/rust-lang/rust/issues/14302 pub fn decode_from<'a, R: 'a+Reader+Buffer, T: Decodable, IoError>>(r: &mut R) -> IoResult { unsafe { Decodable::decode(std::mem::transmute(&mut reader::DecoderReader::new(r))) } } #[cfg(test)] mod test;