Use new io, update for rustc changes
This commit is contained in:
parent
a38f8bc2c7
commit
5f85e9b19a
|
|
@ -12,4 +12,4 @@ description = "A binary serialization / deserialization strategy and implementat
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rustc-serialize = "*"
|
rustc-serialize = "*"
|
||||||
byteorder = "*"
|
byteorder = "0.2.9"
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ fn main() {
|
||||||
// 8 bytes for the length of the vector, 4 bytes per float.
|
// 8 bytes for the length of the vector, 4 bytes per float.
|
||||||
assert_eq!(encoded.len(), 8 + 4 * 4);
|
assert_eq!(encoded.len(), 8 + 4 * 4);
|
||||||
|
|
||||||
let decoded: World = bincode::decode(&encoded[]).unwrap();
|
let decoded: World = bincode::decode(&encoded[..]).unwrap();
|
||||||
|
|
||||||
assert!(world == decoded);
|
assert!(world == decoded);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
#![crate_type = "dylib"]
|
#![crate_type = "dylib"]
|
||||||
|
|
||||||
#![doc(html_logo_url = "./icon.png")]
|
#![doc(html_logo_url = "./icon.png")]
|
||||||
#![feature(hash, core, io, unicode, collections)]
|
#![feature(core, io, unicode, collections)]
|
||||||
|
|
||||||
extern crate "rustc-serialize" as rustc_serialize;
|
extern crate "rustc-serialize" as rustc_serialize;
|
||||||
extern crate byteorder;
|
extern crate byteorder;
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ use std::fmt;
|
||||||
use rustc_serialize::Decoder;
|
use rustc_serialize::Decoder;
|
||||||
|
|
||||||
use byteorder::{BigEndian, ReadBytesExt};
|
use byteorder::{BigEndian, ReadBytesExt};
|
||||||
|
use byteorder::Error as ByteOrderError;
|
||||||
|
|
||||||
use unicode;
|
use unicode;
|
||||||
|
|
||||||
use super::SizeLimit;
|
use super::SizeLimit;
|
||||||
|
|
@ -63,8 +65,15 @@ impl fmt::Display for DecodingError {
|
||||||
|
|
||||||
pub type DecodingResult<T> = Result<T, DecodingError>;
|
pub type DecodingResult<T> = Result<T, DecodingError>;
|
||||||
|
|
||||||
fn wrap_io(err: IoError) -> DecodingError {
|
fn wrap_io(err: ByteOrderError) -> DecodingError {
|
||||||
DecodingError::IoError(err)
|
match err {
|
||||||
|
ByteOrderError::Io(ioe) => DecodingError::IoError(ioe),
|
||||||
|
ByteOrderError::UnexpectedEOF =>
|
||||||
|
DecodingError::InvalidEncoding(InvalidEncoding {
|
||||||
|
desc: "Unexpected EOF while reading a multi-byte number",
|
||||||
|
detail: None
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Error for DecodingError {
|
impl Error for DecodingError {
|
||||||
|
|
@ -201,7 +210,7 @@ impl<'a, R: BufRead> Decoder for DecoderReader<'a, R> {
|
||||||
|
|
||||||
let mut buf = [0];
|
let mut buf = [0];
|
||||||
|
|
||||||
let _ = try!(self.reader.read(&mut buf[]));
|
let _ = try!(self.reader.read(&mut buf[..]));
|
||||||
let first_byte = buf[0];
|
let first_byte = buf[0];
|
||||||
let width = unicode::str::utf8_char_width(first_byte);
|
let width = unicode::str::utf8_char_width(first_byte);
|
||||||
if width == 1 { return Ok(first_byte as char) }
|
if width == 1 { return Ok(first_byte as char) }
|
||||||
|
|
|
||||||
32
src/test.rs
32
src/test.rs
|
|
@ -1,5 +1,3 @@
|
||||||
extern crate "rustc-serialize" as serialize;
|
|
||||||
|
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
|
@ -26,20 +24,20 @@ use super::SizeLimit::{Infinite, Bounded};
|
||||||
fn the_same<V>(element: V)
|
fn the_same<V>(element: V)
|
||||||
where V: Encodable + Decodable + PartialEq + Debug + 'static {
|
where V: Encodable + Decodable + PartialEq + Debug + 'static {
|
||||||
|
|
||||||
// Make sure that the bahavior is correct when wrapping with a RefBox.
|
// Make sure that the bahavior isize correct when wrapping with a RefBox.
|
||||||
fn ref_box_correct<V>(v: &V) -> bool
|
fn ref_box_correct<V>(v: &V) -> bool
|
||||||
where V: Encodable + Decodable + PartialEq + Debug + 'static {
|
where V: Encodable + Decodable + PartialEq + Debug + 'static {
|
||||||
let rf = RefBox::new(v);
|
let rf = RefBox::new(v);
|
||||||
|
|
||||||
let encoded = encode(&rf, Infinite).unwrap();
|
let encoded = encode(&rf, Infinite).unwrap();
|
||||||
let decoded: RefBox<'static, V> = decode(&encoded[]).unwrap();
|
let decoded: RefBox<'static, V> = decode(&encoded[..]).unwrap();
|
||||||
|
|
||||||
decoded.take().deref() == v
|
decoded.take().deref() == v
|
||||||
}
|
}
|
||||||
|
|
||||||
let size = encoded_size(&element);
|
let size = encoded_size(&element);
|
||||||
let encoded = encode(&element, Infinite).unwrap();
|
let encoded = encode(&element, Infinite).unwrap();
|
||||||
let decoded = decode(&encoded[]).unwrap();
|
let decoded = decode(&encoded[..]).unwrap();
|
||||||
assert!(element == decoded);
|
assert!(element == decoded);
|
||||||
assert!(size == encoded.len() as u64);
|
assert!(size == encoded.len() as u64);
|
||||||
assert!(ref_box_correct(&element))
|
assert!(ref_box_correct(&element))
|
||||||
|
|
@ -78,9 +76,9 @@ fn test_string() {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_tuple() {
|
fn test_tuple() {
|
||||||
the_same((1is,));
|
the_same((1isize,));
|
||||||
the_same((1is,2is,3is));
|
the_same((1isize,2isize,3isize));
|
||||||
the_same((1is,"foo".to_string(),()));
|
the_same((1isize,"foo".to_string(),()));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
@ -126,7 +124,7 @@ fn test_struct_tuple() {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn option() {
|
fn option() {
|
||||||
the_same(Some(5us));
|
the_same(Some(5usize));
|
||||||
the_same(Some("foo bar".to_string()));
|
the_same(Some("foo bar".to_string()));
|
||||||
the_same(None::<usize>);
|
the_same(None::<usize>);
|
||||||
}
|
}
|
||||||
|
|
@ -193,7 +191,7 @@ fn unicode() {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn decoding_errors() {
|
fn decoding_errors() {
|
||||||
fn is_invalid_encoding<T>(res: DecodingResult<T>) {
|
fn isize_invalid_encoding<T>(res: DecodingResult<T>) {
|
||||||
match res {
|
match res {
|
||||||
Ok(_) => panic!("Expecting error"),
|
Ok(_) => panic!("Expecting error"),
|
||||||
Err(DecodingError::IoError(_)) => panic!("Expecting InvalidEncoding"),
|
Err(DecodingError::IoError(_)) => panic!("Expecting InvalidEncoding"),
|
||||||
|
|
@ -202,16 +200,16 @@ fn decoding_errors() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is_invalid_encoding(decode::<bool>(vec![0xA].as_slice()));
|
isize_invalid_encoding(decode::<bool>(vec![0xA].as_slice()));
|
||||||
is_invalid_encoding(decode::<String>(vec![0, 0, 0, 0, 0, 0, 0, 1, 0xFF].as_slice()));
|
isize_invalid_encoding(decode::<String>(vec![0, 0, 0, 0, 0, 0, 0, 1, 0xFF].as_slice()));
|
||||||
// Out-of-bounds variant
|
// Out-of-bounds variant
|
||||||
#[derive(RustcEncodable, RustcDecodable)]
|
#[derive(RustcEncodable, RustcDecodable)]
|
||||||
enum Test {
|
enum Test {
|
||||||
One,
|
One,
|
||||||
Two,
|
Two,
|
||||||
};
|
};
|
||||||
is_invalid_encoding(decode::<Test>(vec![0, 0, 0, 5].as_slice()));
|
isize_invalid_encoding(decode::<Test>(vec![0, 0, 0, 5].as_slice()));
|
||||||
is_invalid_encoding(decode::<Option<u8>>(vec![5, 0].as_slice()));
|
isize_invalid_encoding(decode::<Option<u8>>(vec![5, 0].as_slice()));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
@ -251,7 +249,7 @@ fn test_encoded_size() {
|
||||||
assert!(encoded_size(&0u32) == 4);
|
assert!(encoded_size(&0u32) == 4);
|
||||||
assert!(encoded_size(&0u64) == 8);
|
assert!(encoded_size(&0u64) == 8);
|
||||||
|
|
||||||
// length is stored as u64
|
// length isize stored as u64
|
||||||
assert!(encoded_size(&"") == 8);
|
assert!(encoded_size(&"") == 8);
|
||||||
assert!(encoded_size(&"a") == 8 + 1);
|
assert!(encoded_size(&"a") == 8 + 1);
|
||||||
|
|
||||||
|
|
@ -279,7 +277,7 @@ fn test_refbox() {
|
||||||
// Test 1
|
// Test 1
|
||||||
{
|
{
|
||||||
let encoded = encode(&Message::M1(RefBox::new(&large_object)), Infinite).unwrap();
|
let encoded = encode(&Message::M1(RefBox::new(&large_object)), Infinite).unwrap();
|
||||||
let decoded: Message<'static> = decode(&encoded[]).unwrap();
|
let decoded: Message<'static> = decode(&encoded[..]).unwrap();
|
||||||
|
|
||||||
match decoded {
|
match decoded {
|
||||||
Message::M1(b) => assert!(b.take().deref() == &large_object),
|
Message::M1(b) => assert!(b.take().deref() == &large_object),
|
||||||
|
|
@ -290,7 +288,7 @@ fn test_refbox() {
|
||||||
// Test 2
|
// Test 2
|
||||||
{
|
{
|
||||||
let encoded = encode(&Message::M2(RefBox::new(&large_map)), Infinite).unwrap();
|
let encoded = encode(&Message::M2(RefBox::new(&large_map)), Infinite).unwrap();
|
||||||
let decoded: Message<'static> = decode(&encoded[]).unwrap();
|
let decoded: Message<'static> = decode(&encoded[..]).unwrap();
|
||||||
|
|
||||||
match decoded {
|
match decoded {
|
||||||
Message::M2(b) => assert!(b.take().deref() == &large_map),
|
Message::M2(b) => assert!(b.take().deref() == &large_map),
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,14 @@
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::io::Error as IoError;
|
use std::io::Error as IoError;
|
||||||
|
use std::io::ErrorKind as IoErrorKind;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::num::Int;
|
use std::num::Int;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use rustc_serialize::Encoder;
|
use rustc_serialize::Encoder;
|
||||||
|
|
||||||
use byteorder::{BigEndian, WriteBytesExt};
|
use byteorder::{BigEndian, WriteBytesExt};
|
||||||
|
use byteorder::Error as ByteOrderError;
|
||||||
|
|
||||||
pub type EncodingResult<T> = Result<T, EncodingError>;
|
pub type EncodingResult<T> = Result<T, EncodingError>;
|
||||||
|
|
||||||
|
|
@ -35,8 +38,14 @@ pub struct SizeChecker {
|
||||||
pub written: u64
|
pub written: u64
|
||||||
}
|
}
|
||||||
|
|
||||||
fn wrap_io(err: IoError) -> EncodingError {
|
fn wrap_io(err: ByteOrderError) -> EncodingError {
|
||||||
EncodingError::IoError(err)
|
match err {
|
||||||
|
ByteOrderError::Io(ioe) => EncodingError::IoError(ioe),
|
||||||
|
ByteOrderError::UnexpectedEOF => EncodingError::IoError(
|
||||||
|
IoError::new(IoErrorKind::Other,
|
||||||
|
"ByteOrder could not write to the buffer",
|
||||||
|
None))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for EncodingError {
|
impl fmt::Display for EncodingError {
|
||||||
|
|
@ -140,13 +149,13 @@ impl<'a, W: Write> Encoder for EncoderWriter<'a, W> {
|
||||||
}
|
}
|
||||||
fn emit_char(&mut self, v: char) -> EncodingResult<()> {
|
fn emit_char(&mut self, v: char) -> EncodingResult<()> {
|
||||||
let mut cbuf = [0; 4];
|
let mut cbuf = [0; 4];
|
||||||
let sz = v.encode_utf8(&mut cbuf[]).unwrap_or(0);
|
let sz = v.encode_utf8(&mut cbuf[..]).unwrap_or(0);
|
||||||
let ptr = &cbuf[..sz];
|
let ptr = &cbuf[..sz];
|
||||||
self.writer.write_all(ptr).map_err(wrap_io)
|
self.writer.write_all(ptr).map_err(EncodingError::IoError)
|
||||||
}
|
}
|
||||||
fn emit_str(&mut self, v: &str) -> EncodingResult<()> {
|
fn emit_str(&mut self, v: &str) -> EncodingResult<()> {
|
||||||
try!(self.emit_usize(v.len()));
|
try!(self.emit_usize(v.len()));
|
||||||
self.writer.write_all(v.as_bytes()).map_err(wrap_io)
|
self.writer.write_all(v.as_bytes()).map_err(EncodingError::IoError)
|
||||||
}
|
}
|
||||||
fn emit_enum<F>(&mut self, __: &str, f: F) -> EncodingResult<()> where
|
fn emit_enum<F>(&mut self, __: &str, f: F) -> EncodingResult<()> where
|
||||||
F: FnOnce(&mut EncoderWriter<'a, W>) -> EncodingResult<()> {
|
F: FnOnce(&mut EncoderWriter<'a, W>) -> EncodingResult<()> {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue