diff --git a/Cargo.toml b/Cargo.toml index fc15230..38c8544 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,4 +11,4 @@ license = "MIT" description = "A binary serialization / deserialization strategy and implementation." [dependencies] -rustc-serialize = "0.2.2" +rustc-serialize = "0.2.5" diff --git a/src/lib.rs b/src/lib.rs index 4b150a2..d96929e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,13 +2,13 @@ #![crate_type = "rlib"] #![crate_type = "dylib"] #![feature(old_orphan_check)] +#![feature(associated_types)] extern crate "rustc-serialize" as rustc_serialize; use std::io::Buffer; use std::io::MemWriter; use std::io::MemReader; -use std::io::IoError; use std::io::IoResult; use rustc_serialize::Encodable; use rustc_serialize::Decodable; @@ -25,8 +25,7 @@ pub enum SizeLimit { UpperBound(u64) } -pub fn encode<'a, T>(t: &T, size_limit: SizeLimit) -> IoResult> -where T: Encodable, IoError> { +pub fn encode(t: &T, size_limit: SizeLimit) -> IoResult> { let mut w = MemWriter::new(); match encode_into(t, &mut w, size_limit) { Ok(()) => Ok(w.into_inner()), @@ -34,28 +33,16 @@ where T: Encodable, IoError> { } } -pub fn decode<'a, T>(b: Vec, size_limit: SizeLimit) -> IoResult -where T: Decodable, IoError> { +pub fn decode(b: Vec, size_limit: SizeLimit) -> IoResult { decode_from(&mut MemReader::new(b), size_limit) } -// 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, T>(t: &T, w: &mut W, size_limit: SizeLimit) -> IoResult<()> -where W: 'a + Writer, T: Encodable, IoError>{ - unsafe { - t.encode(std::mem::transmute(&mut writer::EncoderWriter::new(w, size_limit))) - } +pub fn encode_into(t: &T, w: &mut W, size_limit: SizeLimit) -> IoResult<()> { + t.encode(&mut writer::EncoderWriter::new(w, size_limit)) } -// TODO: Make code safe https://github.com/rust-lang/rust/issues/14302 -pub fn decode_from<'a, R, T>(r: &mut R, size_limit: SizeLimit) -> IoResult -where R: 'a + Reader + Buffer, T: Decodable, IoError>{ - unsafe { - Decodable::decode(std::mem::transmute(&mut reader::DecoderReader::new(r, size_limit))) - } +pub fn decode_from(r: &mut R, size_limit: SizeLimit) -> IoResult { + Decodable::decode(&mut reader::DecoderReader::new(r, size_limit)) } #[cfg(test)] diff --git a/src/reader.rs b/src/reader.rs index 09b8523..e2d1a8e 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -18,7 +18,9 @@ impl<'a, R: Reader+Buffer> DecoderReader<'a, R> { } } -impl<'a, R: Reader+Buffer> Decoder for DecoderReader<'a, R> { +impl<'a, R: Reader+Buffer> Decoder for DecoderReader<'a, R> { + type Error = IoError; + fn read_nil(&mut self) -> IoResult<()> { Ok(()) } diff --git a/src/test.rs b/src/test.rs index 884907c..ef3b7c0 100644 --- a/src/test.rs +++ b/src/test.rs @@ -1,9 +1,6 @@ extern crate "rustc-serialize" as serialize; -use std::io::MemWriter; use std::fmt::Show; -use std::io::MemReader; -use std::io::IoError; use std::collections::HashMap; use rustc_serialize::{ @@ -14,18 +11,12 @@ use rustc_serialize::{ }; use super::{ - EncoderWriter, - DecoderReader, encode, decode, - SizeLimit }; use super::SizeLimit::Infinite; -fn the_same<'a, - V: Encodable, IoError> + - Decodable, IoError> + - PartialEq + Show>(element: V) { +fn the_same<'a, V>(element: V) where V: Encodable, V: Decodable, V: PartialEq, V: Show { assert!(element == decode(encode(&element, Infinite).unwrap(), Infinite).unwrap()); } diff --git a/src/writer.rs b/src/writer.rs index df7c8ad..16edfd4 100644 --- a/src/writer.rs +++ b/src/writer.rs @@ -21,7 +21,9 @@ impl <'a, W: Writer> EncoderWriter<'a, W> { } } -impl<'a, W: Writer> Encoder for EncoderWriter<'a, W> { +impl<'a, W: Writer> Encoder for EncoderWriter<'a, W> { + type Error = IoError; + fn emit_nil(&mut self) -> EwResult { Ok(()) } fn emit_uint(&mut self, v: uint) -> EwResult { self.emit_u64(v as u64)