use std::io::Buffer; use std::io::Reader; use std::io::IoError; use std::io::IoResult; use std::io::OtherIoError; use serialize::Decoder; pub struct DecoderReader<'a, R: 'a> { reader: &'a mut R } impl<'a, R: Reader+Buffer> DecoderReader<'a, R> { pub fn new(r: &'a mut R) -> DecoderReader<'a, R> { DecoderReader { reader: r } } } impl<'a, R: Reader+Buffer> Decoder for DecoderReader<'a, R> { fn read_nil(&mut self) -> IoResult<()> { Ok(()) } fn read_uint(&mut self) -> IoResult { match self.reader.read_be_u64() { Ok(x) => Ok(x as uint), Err(e) => Err(e) } } fn read_u64(&mut self) -> IoResult { self.reader.read_be_u64() } fn read_u32(&mut self) -> IoResult { self.reader.read_be_u32() } fn read_u16(&mut self) -> IoResult { self.reader.read_be_u16() } fn read_u8(&mut self) -> IoResult { self.reader.read_u8() } fn read_int(&mut self) -> IoResult { self.reader.read_be_int() } fn read_i64(&mut self) -> IoResult { self.reader.read_be_i64() } fn read_i32(&mut self) -> IoResult { self.reader.read_be_i32() } fn read_i16(&mut self) -> IoResult { self.reader.read_be_i16() } fn read_i8(&mut self) -> IoResult { self.reader.read_i8() } fn read_bool(&mut self) -> IoResult { match try!(self.reader.read_i8()) { 1 => Ok(true), _ => Ok(false) } } fn read_f64(&mut self) -> IoResult { self.reader.read_be_f64() } fn read_f32(&mut self) -> IoResult { self.reader.read_be_f32() } fn read_char(&mut self) -> IoResult { self.reader.read_char() } fn read_str(&mut self) -> IoResult { let len = try!(self.read_uint()); let mut vector = Vec::with_capacity(len as uint); for _ in range(0, len) { vector.push(try!(self.reader.read_u8())); } Ok(String::from_utf8(vector).unwrap()) } fn read_enum(&mut self, _: &str, f: |&mut DecoderReader<'a, R>| -> IoResult) -> IoResult { f(self) } fn read_enum_variant(&mut self, _: &[&str], f: |&mut DecoderReader<'a, R>, uint| -> IoResult) -> IoResult { let id = try!(self.read_uint()); f(self, id) } fn read_enum_variant_arg(&mut self, _: uint, f: |&mut DecoderReader<'a, R>| -> IoResult) -> IoResult { f(self) } fn read_enum_struct_variant(&mut self, names: &[&str], f: |&mut DecoderReader<'a, R>, uint| -> IoResult) -> IoResult { self.read_enum_variant(names, f) } fn read_enum_struct_variant_field(&mut self, _: &str, f_idx: uint, f: |&mut DecoderReader<'a, R>| -> IoResult) -> IoResult { self.read_enum_variant_arg(f_idx, f) } fn read_struct(&mut self, _: &str, _: uint, f: |&mut DecoderReader<'a, R>| -> IoResult) -> IoResult { f(self) } fn read_struct_field(&mut self, _: &str, _: uint, f: |&mut DecoderReader<'a, R>| -> IoResult) -> IoResult { f(self) } fn read_tuple(&mut self, f: |&mut DecoderReader<'a, R>, uint| -> IoResult) -> IoResult { let len = try!(self.read_uint()); f(self, len) } fn read_tuple_arg(&mut self, _: uint, f: |&mut DecoderReader<'a, R>| -> IoResult) -> IoResult { f(self) } fn read_tuple_struct(&mut self, _: &str, f: |&mut DecoderReader<'a, R>, uint| -> IoResult) -> IoResult { self.read_tuple(f) } fn read_tuple_struct_arg(&mut self, a_idx: uint, f: |&mut DecoderReader<'a, R>| -> IoResult) -> IoResult { self.read_tuple_arg(a_idx, f) } fn read_option(&mut self, f: |&mut DecoderReader<'a, R>, bool| -> IoResult) -> IoResult { match try!(self.reader.read_u8()) { 1 => f(self, true), _ => f(self, false) } } fn read_seq(&mut self, f: |&mut DecoderReader<'a, R>, uint| -> IoResult) -> IoResult { let len = try!(self.read_uint()); f(self, len) } fn read_seq_elt(&mut self, _: uint, f: |&mut DecoderReader<'a, R>| -> IoResult) -> IoResult { f(self) } fn read_map(&mut self, f: |&mut DecoderReader<'a, R>, uint| -> IoResult) -> IoResult { let len = try!(self.read_uint()); f(self, len) } fn read_map_elt_key(&mut self, _: uint, f: |&mut DecoderReader<'a, R>| -> IoResult) -> IoResult { f(self) } fn read_map_elt_val(&mut self, _: uint, f: |&mut DecoderReader<'a, R>| -> IoResult) -> IoResult { f(self) } fn error(&mut self, err: &str) -> IoError { IoError { kind: OtherIoError, desc: "failure decoding or something, I don't know", detail: Some(err.to_string()) } } }