Merge pull request #12 from bitonic/master

Update to the latest rustc-serialize
This commit is contained in:
Ty 2015-01-06 21:07:10 -08:00
commit 2c1c2b2ee5
5 changed files with 15 additions and 33 deletions

View File

@ -11,4 +11,4 @@ license = "MIT"
description = "A binary serialization / deserialization strategy and implementation." description = "A binary serialization / deserialization strategy and implementation."
[dependencies] [dependencies]
rustc-serialize = "0.2.2" rustc-serialize = "0.2.5"

View File

@ -2,13 +2,13 @@
#![crate_type = "rlib"] #![crate_type = "rlib"]
#![crate_type = "dylib"] #![crate_type = "dylib"]
#![feature(old_orphan_check)] #![feature(old_orphan_check)]
#![feature(associated_types)]
extern crate "rustc-serialize" as rustc_serialize; extern crate "rustc-serialize" as rustc_serialize;
use std::io::Buffer; use std::io::Buffer;
use std::io::MemWriter; use std::io::MemWriter;
use std::io::MemReader; use std::io::MemReader;
use std::io::IoError;
use std::io::IoResult; use std::io::IoResult;
use rustc_serialize::Encodable; use rustc_serialize::Encodable;
use rustc_serialize::Decodable; use rustc_serialize::Decodable;
@ -25,8 +25,7 @@ pub enum SizeLimit {
UpperBound(u64) UpperBound(u64)
} }
pub fn encode<'a, T>(t: &T, size_limit: SizeLimit) -> IoResult<Vec<u8>> pub fn encode<T: Encodable>(t: &T, size_limit: SizeLimit) -> IoResult<Vec<u8>> {
where T: Encodable<EncoderWriter<'a, MemWriter>, IoError> {
let mut w = MemWriter::new(); let mut w = MemWriter::new();
match encode_into(t, &mut w, size_limit) { match encode_into(t, &mut w, size_limit) {
Ok(()) => Ok(w.into_inner()), Ok(()) => Ok(w.into_inner()),
@ -34,28 +33,16 @@ where T: Encodable<EncoderWriter<'a, MemWriter>, IoError> {
} }
} }
pub fn decode<'a, T>(b: Vec<u8>, size_limit: SizeLimit) -> IoResult<T> pub fn decode<T: Decodable>(b: Vec<u8>, size_limit: SizeLimit) -> IoResult<T> {
where T: Decodable<DecoderReader<'a, MemReader>, IoError> {
decode_from(&mut MemReader::new(b), size_limit) 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 pub fn encode_into<T: Encodable, W: Writer>(t: &T, w: &mut W, size_limit: SizeLimit) -> IoResult<()> {
// the current json encoder in the stdlib t.encode(&mut writer::EncoderWriter::new(w, size_limit))
// 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<EncoderWriter<'a, W>, IoError>{
unsafe {
t.encode(std::mem::transmute(&mut writer::EncoderWriter::new(w, size_limit)))
}
} }
// TODO: Make code safe https://github.com/rust-lang/rust/issues/14302 pub fn decode_from<R: Reader+Buffer, T: Decodable>(r: &mut R, size_limit: SizeLimit) -> IoResult<T> {
pub fn decode_from<'a, R, T>(r: &mut R, size_limit: SizeLimit) -> IoResult<T> Decodable::decode(&mut reader::DecoderReader::new(r, size_limit))
where R: 'a + Reader + Buffer, T: Decodable<DecoderReader<'a, R>, IoError>{
unsafe {
Decodable::decode(std::mem::transmute(&mut reader::DecoderReader::new(r, size_limit)))
}
} }
#[cfg(test)] #[cfg(test)]

View File

@ -18,7 +18,9 @@ impl<'a, R: Reader+Buffer> DecoderReader<'a, R> {
} }
} }
impl<'a, R: Reader+Buffer> Decoder<IoError> for DecoderReader<'a, R> { impl<'a, R: Reader+Buffer> Decoder for DecoderReader<'a, R> {
type Error = IoError;
fn read_nil(&mut self) -> IoResult<()> { fn read_nil(&mut self) -> IoResult<()> {
Ok(()) Ok(())
} }

View File

@ -1,9 +1,6 @@
extern crate "rustc-serialize" as serialize; extern crate "rustc-serialize" as serialize;
use std::io::MemWriter;
use std::fmt::Show; use std::fmt::Show;
use std::io::MemReader;
use std::io::IoError;
use std::collections::HashMap; use std::collections::HashMap;
use rustc_serialize::{ use rustc_serialize::{
@ -14,18 +11,12 @@ use rustc_serialize::{
}; };
use super::{ use super::{
EncoderWriter,
DecoderReader,
encode, encode,
decode, decode,
SizeLimit
}; };
use super::SizeLimit::Infinite; use super::SizeLimit::Infinite;
fn the_same<'a, fn the_same<'a, V>(element: V) where V: Encodable, V: Decodable, V: PartialEq, V: Show {
V: Encodable<EncoderWriter<'a, MemWriter>, IoError> +
Decodable<DecoderReader<'a, MemReader>, IoError> +
PartialEq + Show>(element: V) {
assert!(element == decode(encode(&element, Infinite).unwrap(), Infinite).unwrap()); assert!(element == decode(encode(&element, Infinite).unwrap(), Infinite).unwrap());
} }

View File

@ -21,7 +21,9 @@ impl <'a, W: Writer> EncoderWriter<'a, W> {
} }
} }
impl<'a, W: Writer> Encoder<IoError> 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_nil(&mut self) -> EwResult { Ok(()) }
fn emit_uint(&mut self, v: uint) -> EwResult { fn emit_uint(&mut self, v: uint) -> EwResult {
self.emit_u64(v as u64) self.emit_u64(v as u64)