// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! Support code for encoding and decoding types. //! //! In order to allow extensibility in both what types can be encoded and how //! they are encoded, encoding and decoding are split into two part each. An //! implementation of the Encodable trait knows how to turn a specific type into //! a generic form, and then uses an implementation of the Encoder trait to turn //! this into concrete output (such as a JSON string). Decoder and Decodable do //! the same for decoding. /* Core encoding and decoding interfaces. */ use core::cell::{Cell, RefCell}; use alloc::rc::Rc; use alloc::arc::Arc; use alloc::boxed::Box; use core::marker::PhantomData; use collections::borrow::{ToOwned,Cow}; use collections::{String,Vec}; use cap_capacity; /// Trait for writing out an encoding when serializing. /// /// This trait provides methods to encode basic types and generic forms of /// collections. Implementations of `Encodable` use it to perform the actual /// encoding of a type. /// /// It is unspecified what is done with the encoding - it could be stored in a /// variable, or written directly to a file, for example. /// /// Encoders can expect to only have a single "root" method call made on this /// trait. Non-trivial types will call one of the collection-emitting methods, /// passing a function that may call other methods on the trait, but once the /// collection-emitting method has returned, encoding should be complete. pub trait Encoder { /// The error type for method results. type Error; // Primitive types: /// Emit a nil value. /// /// For example, this might be stored as the null keyword in JSON. fn emit_nil(&mut self) -> Result<(), Self::Error>; /// Emit a usize value. fn emit_usize(&mut self, v: usize) -> Result<(), Self::Error>; /// Emit a u64 value. fn emit_u64(&mut self, v: u64) -> Result<(), Self::Error>; /// Emit a u32 value. fn emit_u32(&mut self, v: u32) -> Result<(), Self::Error>; /// Emit a u16 value. fn emit_u16(&mut self, v: u16) -> Result<(), Self::Error>; /// Emit a u8 value. fn emit_u8(&mut self, v: u8) -> Result<(), Self::Error>; /// Emit a isize value. fn emit_isize(&mut self, v: isize) -> Result<(), Self::Error>; /// Emit a i64 value. fn emit_i64(&mut self, v: i64) -> Result<(), Self::Error>; /// Emit a i32 value. fn emit_i32(&mut self, v: i32) -> Result<(), Self::Error>; /// Emit a i16 value. fn emit_i16(&mut self, v: i16) -> Result<(), Self::Error>; /// Emit a i8 value. fn emit_i8(&mut self, v: i8) -> Result<(), Self::Error>; /// Emit a bool value. /// /// For example, this might be stored as the true and false keywords in /// JSON. fn emit_bool(&mut self, v: bool) -> Result<(), Self::Error>; /// Emit a f64 value. fn emit_f64(&mut self, v: f64) -> Result<(), Self::Error>; /// Emit a f32 value. fn emit_f32(&mut self, v: f32) -> Result<(), Self::Error>; /// Emit a char value. /// /// Note that strings should be emitted using `emit_str`, not as a sequence /// of `emit_char` calls. fn emit_char(&mut self, v: char) -> Result<(), Self::Error>; /// Emit a string value. fn emit_str(&mut self, v: &str) -> Result<(), Self::Error>; // Compound types: /// Emit an enumeration value. /// /// * `name` indicates the enumeration type name. /// * `f` is a function that will call `emit_enum_variant` or /// `emit_enum_struct_variant` as appropriate to write the actual value. fn emit_enum(&mut self, name: &str, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit a enumeration variant value with no or unnamed data. /// /// This should only be called from a function passed to `emit_enum`. /// Variants with named data should use `emit_enum_struct_variant`. /// /// * `v_name` is the variant name /// * `v_id` is the numeric identifier for the variant. /// * `len` is the number of data items associated with the variant. /// * `f` is a function that will call `emit_enum_variant_arg` for each data /// item. It may not be called if len is 0. /// /// # Examples /// /// ``` /// use rustc_serialize::Encodable; /// use rustc_serialize::Encoder; /// /// enum Message { /// Quit, /// ChangeColor(i32, i32, i32), /// } /// /// impl Encodable for Message { /// fn encode(&self, s: &mut S) -> Result<(), S::Error> { /// s.emit_enum("Message", |s| { /// match *self { /// Message::Quit => { /// s.emit_enum_variant("Quit", 0, 0, |s| Ok(())) /// } /// Message::ChangeColor(r, g, b) => { /// s.emit_enum_variant("ChangeColor", 1, 3, |s| { /// try!(s.emit_enum_variant_arg(0, |s| { /// s.emit_i32(r) /// })); /// try!(s.emit_enum_variant_arg(1, |s| { /// s.emit_i32(g) /// })); /// try!(s.emit_enum_variant_arg(2, |s| { /// s.emit_i32(b) /// })); /// Ok(()) /// }) /// } /// } /// }) /// } /// } /// ``` fn emit_enum_variant(&mut self, v_name: &str, v_id: usize, len: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit an unnamed data item for an enumeration variant. /// /// This should only be called from a function passed to /// `emit_enum_variant`. /// /// * `a_idx` is the (zero-based) index of the data item. /// * `f` is a function that will call the appropriate emit method to encode /// the data object. /// /// Note that variant data items must be emitted in order - starting with /// index `0` and finishing with index `len-1`. fn emit_enum_variant_arg(&mut self, a_idx: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit a enumeration variant value with no or named data. /// /// This should only be called from a function passed to `emit_enum`. /// Variants with unnamed data should use `emit_enum_variant`. /// /// * `v_name` is the variant name. /// * `v_id` is the numeric identifier for the variant. /// * `len` is the number of data items associated with the variant. /// * `f` is a function that will call `emit_enum_struct_variant_field` for /// each data item. It may not be called if `len` is `0`. /// /// # Examples /// /// ``` /// use rustc_serialize::Encodable; /// use rustc_serialize::Encoder; /// /// enum Message { /// Quit, /// Move { x: i32, y: i32 }, /// } /// /// impl Encodable for Message { /// fn encode(&self, s: &mut S) -> Result<(), S::Error> { /// s.emit_enum("Message", |s| { /// match *self { /// Message::Quit => { /// s.emit_enum_struct_variant("Quit", 0, 0, |s| Ok(())) /// } /// Message::Move { x: x, y: y } => { /// s.emit_enum_struct_variant("Move", 1, 2, |s| { /// try!(s.emit_enum_struct_variant_field("x", 0, |s| { /// s.emit_i32(x) /// })); /// try!(s.emit_enum_struct_variant_field("y", 1, |s| { /// s.emit_i32(y) /// })); /// Ok(()) /// }) /// } /// } /// }) /// } /// } /// ``` fn emit_enum_struct_variant(&mut self, v_name: &str, v_id: usize, len: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit a named data item for an enumeration variant. /// /// This should only be called from a function passed to /// `emit_enum_struct_variant`. /// /// * `f_name` is the name of the data item field. /// * `f_idx` is its (zero-based) index. /// * `f` is a function that will call the appropriate emit method to encode /// the data object. /// /// Note that fields must be emitted in order - starting with index `0` and /// finishing with index `len-1`. fn emit_enum_struct_variant_field(&mut self, f_name: &str, f_idx: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit a struct value. /// /// * `name` is the name of the struct. /// * `len` is the number of members. /// * `f` is a function that calls `emit_struct_field` for each member. /// /// # Examples /// /// ``` /// use rustc_serialize::Encodable; /// use rustc_serialize::Encoder; /// /// struct Point { /// x: i32, /// y: i32, /// } /// /// impl Encodable for Point { /// fn encode(&self, s: &mut S) -> Result<(), S::Error> { /// s.emit_struct("Point", 2, |s| { /// try!(s.emit_struct_field("x", 0, |s| { /// s.emit_i32(self.x) /// })); /// try!(s.emit_struct_field("y", 1, |s| { /// s.emit_i32(self.y) /// })); /// Ok(()) /// }) /// } /// } /// ``` fn emit_struct(&mut self, name: &str, len: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit a field item for a struct. /// /// This should only be called from a function passed to `emit_struct`. /// /// * `f_name` is the name of the data item field. /// * `f_idx` is its (zero-based) index. /// * `f` is a function that will call the appropriate emit method to encode /// the data object. /// /// Note that fields must be emitted in order - starting with index `0` and /// finishing with index `len-1`. fn emit_struct_field(&mut self, f_name: &str, f_idx: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit a tuple value. /// /// * `len` is the number of items in the tuple. /// * `f` is a function that calls `emit_tuple_arg` for each member. /// /// Note that external `Encodable` implementations should not normally need /// to use this method directly; it is meant for the use of this module's /// own implementation of `Encodable` for tuples. fn emit_tuple(&mut self, len: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit a data item for a tuple. /// /// This should only be called from a function passed to `emit_tuple`. /// /// * `idx` is the (zero-based) index of the data item. /// * `f` is a function that will call the appropriate emit method to encode /// the data object. /// /// Note that tuple items must be emitted in order - starting with index `0` /// and finishing with index `len-1`. fn emit_tuple_arg(&mut self, idx: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit a tuple struct value. /// /// * `name` is the name of the tuple struct. /// * `len` is the number of items in the tuple struct. /// * `f` is a function that calls `emit_tuple_struct_arg` for each member. /// /// # Examples /// /// ``` /// use rustc_serialize::Encodable; /// use rustc_serialize::Encoder; /// /// struct Pair(i32,i32); /// /// impl Encodable for Pair { /// fn encode(&self, s: &mut S) -> Result<(), S::Error> { /// let Pair(first,second) = *self; /// s.emit_tuple_struct("Pair", 2, |s| { /// try!(s.emit_tuple_arg(0, |s| { /// s.emit_i32(first) /// })); /// try!(s.emit_tuple_arg(1, |s| { /// s.emit_i32(second) /// })); /// Ok(()) /// }) /// } /// } /// ``` fn emit_tuple_struct(&mut self, name: &str, len: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit a data item for a tuple struct. /// /// This should only be called from a function passed to /// `emit_tuple_struct`. /// /// * `f_idx` is the (zero-based) index of the data item. /// * `f` is a function that will call the appropriate emit method to encode /// the data object. /// /// Note that tuple items must be emitted in order - starting with index `0` /// and finishing with index `len-1`. fn emit_tuple_struct_arg(&mut self, f_idx: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; // Specialized types: /// Emit an optional value. /// /// `f` is a function that will call either `emit_option_none` or /// `emit_option_some` as appropriate. /// /// This method allows encoders to handle `Option` values specially, /// rather than using the generic enum methods, because many encoding /// formats have a built-in "optional" concept. /// /// Note that external `Encodable` implementations should not normally need /// to use this method directly; it is meant for the use of this module's /// own implementation of `Encodable` for `Option`. fn emit_option(&mut self, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit the `None` optional value. /// /// This should only be called from a function passed to `emit_option`. fn emit_option_none(&mut self) -> Result<(), Self::Error>; /// Emit the `Some(x)` optional value. /// /// `f` is a function that will call the appropriate emit method to encode /// the data object. /// /// This should only be called from a function passed to `emit_option`. fn emit_option_some(&mut self, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit a sequence of values. /// /// This should be used for both array-like ordered sequences and set-like /// unordered ones. /// /// * `len` is the number of values in the sequence. /// * `f` is a function that will call `emit_seq_elt` for each value in the /// sequence. fn emit_seq(&mut self, len: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit an element in a sequence. /// /// This should only be called from a function passed to `emit_seq`. /// /// * `idx` is the (zero-based) index of the value in the sequence. /// * `f` is a function that will call the appropriate emit method to encode /// the data object. /// /// Note that sequence elements must be emitted in order - starting with /// index `0` and finishing with index `len-1`. fn emit_seq_elt(&mut self, idx: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit an associative container (map). /// /// * `len` is the number of entries in the map. /// * `f` is a function that will call `emit_map_elt_key` and /// `emit_map_elt_val` for each entry in the map. /// /// # Examples /// /// ``` /// use rustc_serialize::Encodable; /// use rustc_serialize::Encoder; /// /// struct SimpleMap { /// entries: Vec<(K,V)>, /// } /// /// impl Encodable for SimpleMap { /// fn encode(&self, s: &mut S) -> Result<(), S::Error> { /// s.emit_map(self.entries.len(), |s| { /// for (i, e) in self.entries.iter().enumerate() { /// let (ref k, ref v) = *e; /// try!(s.emit_map_elt_key(i, |s| k.encode(s))); /// try!(s.emit_map_elt_val(i, |s| v.encode(s))); /// } /// Ok(()) /// }) /// } /// } /// ``` fn emit_map(&mut self, len: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit the key for an entry in a map. /// /// This should only be called from a function passed to `emit_map`. /// /// * `idx` is the (zero-based) index of the entry in the map /// * `f` is a function that will call the appropriate emit method to encode /// the key. /// /// Note that map entries must be emitted in order - starting with index `0` /// and finishing with index `len-1` - and for each entry, the key should be /// emitted followed immediately by the value. fn emit_map_elt_key(&mut self, idx: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; /// Emit the value for an entry in a map. /// /// This should only be called from a function passed to `emit_map`. /// /// * `idx` is the (zero-based) index of the entry in the map /// * `f` is a function that will call the appropriate emit method to encode /// the value. /// /// Note that map entries must be emitted in order - starting with index `0` /// and finishing with index `len-1` - and for each entry, the key should be /// emitted followed immediately by the value. fn emit_map_elt_val(&mut self, idx: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>; } /// Trait for reading in an encoding for deserialization. /// /// This trait provides methods to decode basic types and generic forms of /// collections. Implementations of `Decodable` use it to perform the actual /// decoding of a type. /// /// Note that, as is typical with deserialization, the design of this API /// assumes you know in advance the form of the data you are decoding (ie: what /// type is encoded). /// /// Decoders can expect to only have a single "root" method call made on this /// trait. Non-trivial types will call one of the collection-reading methods, /// passing a function that may call other methods on the trait, but once the /// collection-reading method has returned, decoding should be complete. pub trait Decoder { /// The error type for method results. type Error; // Primitive types: /// Read a nil value. fn read_nil(&mut self) -> Result<(), Self::Error>; /// Read a usize value. fn read_usize(&mut self) -> Result; /// Read a u64 value. fn read_u64(&mut self) -> Result; /// Read a u32 value. fn read_u32(&mut self) -> Result; /// Read a u16 value. fn read_u16(&mut self) -> Result; /// Read a u8 value. fn read_u8(&mut self) -> Result; /// Read a isize value. fn read_isize(&mut self) -> Result; /// Read a i64 value. fn read_i64(&mut self) -> Result; /// Read a i32 value. fn read_i32(&mut self) -> Result; /// Read a i16 value. fn read_i16(&mut self) -> Result; /// Read a i8 value. fn read_i8(&mut self) -> Result; /// Read a bool value. fn read_bool(&mut self) -> Result; /// Read a f64 value. fn read_f64(&mut self) -> Result; /// Read a f32 value. fn read_f32(&mut self) -> Result; /// Read a char value. fn read_char(&mut self) -> Result; /// Read a string value. fn read_str(&mut self) -> Result; // Compound types: /// Read an enumeration value. /// /// * `name` indicates the enumeration type name. It may be used to /// sanity-check the data being read. /// * `f` is a function that will call `read_enum_variant` (or /// `read_enum_struct_variant`) to read the actual value. fn read_enum(&mut self, name: &str, f: F) -> Result where F: FnOnce(&mut Self) -> Result; /// Read an enumeration value. /// /// * `names` is a list of the enumeration variant names. /// * `f` is a function that will call `read_enum_variant_arg` or /// `read_enum_struct_variant_field` as appropriate to read the /// associated values. It will be passed the index into `names` for the /// variant that is encoded. fn read_enum_variant(&mut self, names: &[&str], f: F) -> Result where F: FnMut(&mut Self, usize) -> Result; /// Read an unnamed data item for an enumeration variant. /// /// This should only be called from a function passed to `read_enum_variant` /// or `read_enum_struct_variant`, and only when the index provided to that /// function indicates that the variant has associated unnamed data. It /// should be called once for each associated data item. /// /// * `a_idx` is the (zero-based) index of the data item. /// * `f` is a function that will call the appropriate read method to deocde /// the data object. /// /// Note that variant data items must be read in order - starting with index /// `0` and finishing with index `len-1`. Implementations may use `a_idx`, /// the call order or both to select the correct data to decode. fn read_enum_variant_arg(&mut self, a_idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result; /// Read an enumeration value. /// /// This is identical to `read_enum_variant`, and is only provided for /// symmetry with the `Encoder` API. fn read_enum_struct_variant(&mut self, names: &[&str], f: F) -> Result where F: FnMut(&mut Self, usize) -> Result; /// Read a named data item for an enumeration variant. /// /// This should only be called from a function passed to `read_enum_variant` /// or `read_enum_struct_variant`, and only when the index provided to that /// function indicates that the variant has associated named data. It should /// be called once for each associated field. /// /// * `f_name` is the name of the field. /// * `f_idx` is the (zero-based) index of the data item. /// * `f` is a function that will call the appropriate read method to deocde /// the data object. /// /// Note that fields must be read in order - starting with index `0` and /// finishing with index `len-1`. Implementations may use `f_idx`, `f_name`, /// the call order or any combination to choose the correct data to decode, /// and may (but are not required to) return an error if these are /// inconsistent. fn read_enum_struct_variant_field(&mut self, &f_name: &str, f_idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result; /// Read an struct value. /// /// * `s_name` indicates the struct type name. It may be used to /// sanity-check the data being read. /// * `len` indicates the number of fields in the struct. /// * `f` is a function that will call `read_struct_field` for each field in /// the struct. fn read_struct(&mut self, s_name: &str, len: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result; /// Read a field for a struct value. /// /// This should only be called from a function passed to `read_struct`. It /// should be called once for each associated field. /// /// * `f_name` is the name of the field. /// * `f_idx` is the (zero-based) index of the data item. /// * `f` is a function that will call the appropriate read method to deocde /// the data object. /// /// Note that fields must be read in order - starting with index `0` and /// finishing with index `len-1`. Implementations may use `f_idx`, `f_name`, /// the call order or any combination to choose the correct data to decode, /// and may (but are not required to) return an error if these are /// inconsistent. fn read_struct_field(&mut self, f_name: &str, f_idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result; /// Read a tuple value. /// /// * `len` is the number of items in the tuple. /// * `f` is a function that will call `read_tuple_arg` for each item in the /// tuple. /// /// Note that external `Decodable` implementations should not normally need /// to use this method directly; it is meant for the use of this module's /// own implementation of `Decodable` for tuples. fn read_tuple(&mut self, len: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result; /// Read a data item for a tuple. /// /// This should only be called from a function passed to `read_tuple`. /// /// * `a_idx` is the (zero-based) index of the data item. /// * `f` is a function that will call the appropriate read method to encode /// the data object. /// /// Note that tuple items must be read in order - starting with index `0` /// and finishing with index `len-1`. fn read_tuple_arg(&mut self, a_idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result; /// Read a tuple struct value. /// /// * `s_name` is the name of the tuple struct. /// * `len` is the number of items in the tuple struct. /// * `f` is a function that calls `read_tuple_struct_arg` for each member. fn read_tuple_struct(&mut self, s_name: &str, len: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result; /// Read a data item for a tuple struct. /// /// This should only be called from a function passed to /// `read_tuple_struct`. /// /// * `a_idx` is the (zero-based) index of the data item. /// * `f` is a function that will call the appropriate read method to encode /// the data object. /// /// Note that tuple struct items must be read in order - starting with index /// `0` and finishing with index `len-1`. fn read_tuple_struct_arg(&mut self, a_idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result; // Specialized types: /// Read an optional value. /// /// `f` is a function that will will be passed be passed `false` if the /// value is unset, and `true` if it is set. If the function is passed /// `true`, it will call the appropriate read methods to read the associated /// data type. /// /// This method allows decoders to handle `Option` values specially, /// rather than using the generic enum methods, because many encoding /// formats have a built-in "optional" concept. /// /// Note that external `Decodable` implementations should not normally need /// to use this method directly; it is meant for the use of this module's /// own implementation of `Decodable` for `Option`. fn read_option(&mut self, f: F) -> Result where F: FnMut(&mut Self, bool) -> Result; /// Read a sequence of values. /// /// This should be used for both array-like ordered sequences and set-like /// unordered ones. /// /// * `f` is a function that will be passed the length of the sequence, and /// will call `read_seq_elt` for each value in the sequence. fn read_seq(&mut self, f: F) -> Result where F: FnOnce(&mut Self, usize) -> Result; /// Read an element in the sequence. /// /// This should only be called from a function passed to `read_seq`. /// /// * `idx` is the (zero-based) index of the value in the sequence. /// * `f` is a function that will call the appropriate read method to decode /// the data object. /// /// Note that sequence elements must be read in order - starting with index /// `0` and finishing with index `len-1`. fn read_seq_elt(&mut self, idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result; /// Read an associative container (map). /// /// * `f` is a function that will be passed the number of entries in the /// map, and will call `emit_map_elt_key` and `emit_map_elt_val` to decode /// each entry. fn read_map(&mut self, f: F) -> Result where F: FnOnce(&mut Self, usize) -> Result; /// Read the key for an entry in a map. /// /// This should only be called from a function passed to `read_map`. /// /// * `idx` is the (zero-based) index of the entry in the map /// * `f` is a function that will call the appropriate read method to decode /// the key. /// /// Note that map entries must be read in order - starting with index `0` /// and finishing with index `len-1` - and for each entry, the key should be /// read followed immediately by the value. fn read_map_elt_key(&mut self, idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result; /// Read the value for an entry in a map. /// /// This should only be called from a function passed to `read_map`. /// /// * `idx` is the (zero-based) index of the entry in the map /// * `f` is a function that will call the appropriate read method to decode /// the value. /// /// Note that map entries must be read in order - starting with index `0` /// and finishing with index `len-1` - and for each entry, the key should be /// read followed immediately by the value. fn read_map_elt_val(&mut self, idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result; // Failure /// Record a decoding error. /// /// This allows `Decodable` implementations to report an error using a /// `Decoder` implementation's error type when inconsistent data is read. /// For example, when reading a fixed-length array and the wrong length is /// given by `read_seq`. fn error(&mut self, err: &str) -> Self::Error; } /// Trait for serializing a type. /// /// This can be implemented for custom data types to allow them to be encoded /// with `Encoder` implementations. Most of Rust's built-in or standard data /// types (like `i32` and `Vec`) have `Encodable` implementations provided by /// this module. /// /// Note that, in general, you should let the compiler implement this for you by /// using the `derive(RustcEncodable)` attribute. /// /// # Examples /// /// ```rust /// extern crate rustc_serialize; /// /// #[derive(RustcEncodable)] /// struct Point { /// x: i32, /// y: i32, /// } /// # fn main() {} /// ``` /// /// This generates code equivalent to: /// /// ```rust /// extern crate rustc_serialize; /// use rustc_serialize::Encodable; /// use rustc_serialize::Encoder; /// /// struct Point { /// x: i32, /// y: i32, /// } /// /// impl Encodable for Point { /// fn encode(&self, s: &mut S) -> Result<(), S::Error> { /// s.emit_struct("Point", 2, |s| { /// try!(s.emit_struct_field("x", 0, |s| { /// s.emit_i32(self.x) /// })); /// try!(s.emit_struct_field("y", 1, |s| { /// s.emit_i32(self.y) /// })); /// Ok(()) /// }) /// } /// } /// # fn main() {} /// ``` pub trait Encodable { /// Serialize a value using an `Encoder`. fn encode(&self, s: &mut S) -> Result<(), S::Error>; } /// Trait for deserializing a type. /// /// This can be implemented for custom data types to allow them to be decoded /// with `Decoder` implementations. Most of Rust's built-in or standard data /// types (like `i32` and `Vec`) have `Decodable` implementations provided by /// this module. /// /// Note that, in general, you should let the compiler implement this for you by /// using the `derive(RustcDecodable)` attribute. /// /// # Examples /// /// ```rust /// extern crate rustc_serialize; /// /// #[derive(RustcDecodable)] /// struct Point { /// x: i32, /// y: i32, /// } /// # fn main() {} /// ``` /// /// This generates code equivalent to: /// /// ```rust /// extern crate rustc_serialize; /// use rustc_serialize::Decodable; /// use rustc_serialize::Decoder; /// /// struct Point { /// x: i32, /// y: i32, /// } /// /// impl Decodable for Point { /// fn decode(d: &mut D) -> Result { /// d.read_struct("Point", 2, |d| { /// let x = try!(d.read_struct_field("x", 0, |d| { d.read_i32() })); /// let y = try!(d.read_struct_field("y", 1, |d| { d.read_i32() })); /// Ok(Point{ x: x, y: y }) /// }) /// } /// } /// # fn main() {} /// ``` pub trait Decodable: Sized { /// Deserialize a value using a `Decoder`. fn decode(d: &mut D) -> Result; } impl Encodable for usize { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_usize(*self) } } impl Decodable for usize { fn decode(d: &mut D) -> Result { d.read_usize() } } impl Encodable for u8 { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u8(*self) } } impl Decodable for u8 { fn decode(d: &mut D) -> Result { d.read_u8() } } impl Encodable for u16 { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u16(*self) } } impl Decodable for u16 { fn decode(d: &mut D) -> Result { d.read_u16() } } impl Encodable for u32 { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u32(*self) } } impl Decodable for u32 { fn decode(d: &mut D) -> Result { d.read_u32() } } impl Encodable for u64 { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u64(*self) } } impl Decodable for u64 { fn decode(d: &mut D) -> Result { d.read_u64() } } impl Encodable for isize { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_isize(*self) } } impl Decodable for isize { fn decode(d: &mut D) -> Result { d.read_isize() } } impl Encodable for i8 { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i8(*self) } } impl Decodable for i8 { fn decode(d: &mut D) -> Result { d.read_i8() } } impl Encodable for i16 { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i16(*self) } } impl Decodable for i16 { fn decode(d: &mut D) -> Result { d.read_i16() } } impl Encodable for i32 { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i32(*self) } } impl Decodable for i32 { fn decode(d: &mut D) -> Result { d.read_i32() } } impl Encodable for i64 { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i64(*self) } } impl Decodable for i64 { fn decode(d: &mut D) -> Result { d.read_i64() } } impl Encodable for str { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_str(self) } } impl Encodable for String { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_str(self) } } impl Decodable for String { fn decode(d: &mut D) -> Result { d.read_str() } } impl Encodable for f32 { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_f32(*self) } } impl Decodable for f32 { fn decode(d: &mut D) -> Result { d.read_f32() } } impl Encodable for f64 { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_f64(*self) } } impl Decodable for f64 { fn decode(d: &mut D) -> Result { d.read_f64() } } impl Encodable for bool { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_bool(*self) } } impl Decodable for bool { fn decode(d: &mut D) -> Result { d.read_bool() } } impl Encodable for char { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_char(*self) } } impl Decodable for char { fn decode(d: &mut D) -> Result { d.read_char() } } impl Encodable for () { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_nil() } } impl Decodable for () { fn decode(d: &mut D) -> Result<(), D::Error> { d.read_nil() } } impl<'a, T: ?Sized + Encodable> Encodable for &'a T { fn encode(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } impl Encodable for Box { fn encode(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } impl< T: Decodable> Decodable for Box { fn decode(d: &mut D) -> Result, D::Error> { Ok(Box::new(try!(Decodable::decode(d)))) } } impl< T: Decodable> Decodable for Box<[T]> { fn decode(d: &mut D) -> Result, D::Error> { let v: Vec = try!(Decodable::decode(d)); Ok(v.into_boxed_slice()) } } impl Encodable for Rc { #[inline] fn encode(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } impl Decodable for Rc { #[inline] fn decode(d: &mut D) -> Result, D::Error> { Ok(Rc::new(try!(Decodable::decode(d)))) } } impl<'a, T:Encodable + ToOwned + ?Sized> Encodable for Cow<'a, T> { #[inline] fn encode(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } impl<'a, T: ?Sized> Decodable for Cow<'a, T> where T: ToOwned, T::Owned: Decodable { #[inline] fn decode(d: &mut D) -> Result, D::Error> { Ok(Cow::Owned(try!(Decodable::decode(d)))) } } impl Encodable for [T] { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { for (i, e) in self.iter().enumerate() { try!(s.emit_seq_elt(i, |s| e.encode(s))) } Ok(()) }) } } impl Encodable for Vec { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { for (i, e) in self.iter().enumerate() { try!(s.emit_seq_elt(i, |s| e.encode(s))) } Ok(()) }) } } impl Decodable for Vec { fn decode(d: &mut D) -> Result, D::Error> { d.read_seq(|d, len| { let mut v = Vec::with_capacity(cap_capacity::(len)); for i in 0..len { v.push(try!(d.read_seq_elt(i, |d| Decodable::decode(d)))); } Ok(v) }) } } impl Encodable for Option { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_option(|s| { match *self { None => s.emit_option_none(), Some(ref v) => s.emit_option_some(|s| v.encode(s)), } }) } } impl Decodable for Option { fn decode(d: &mut D) -> Result, D::Error> { d.read_option(|d, b| { if b { Ok(Some(try!(Decodable::decode(d)))) } else { Ok(None) } }) } } impl Encodable for PhantomData { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_nil() } } impl Decodable for PhantomData { fn decode(_d: &mut D) -> Result, D::Error> { Ok(PhantomData) } } macro_rules! peel { ($name:ident, $($other:ident,)*) => (tuple! { $($other,)* }) } /// Evaluates to the number of identifiers passed to it, for example: /// `count_idents!(a, b, c) == 3 macro_rules! count_idents { () => { 0 }; ($_i:ident, $($rest:ident,)*) => { 1 + count_idents!($($rest,)*) } } macro_rules! tuple { () => (); ( $($name:ident,)+ ) => ( impl<$($name:Decodable),*> Decodable for ($($name,)*) { fn decode(d: &mut D) -> Result<($($name,)*), D::Error> { let len: usize = count_idents!($($name,)*); d.read_tuple(len, |d| { let mut i = 0; let ret = ($(try!(d.read_tuple_arg({ i+=1; i-1 }, |d| -> Result<$name,D::Error> { Decodable::decode(d) })),)*); return Ok(ret); }) } } impl<$($name:Encodable),*> Encodable for ($($name,)*) { #[allow(non_snake_case)] fn encode(&self, s: &mut S) -> Result<(), S::Error> { let ($(ref $name,)*) = *self; let mut n = 0; $(let $name = $name; n += 1;)* s.emit_tuple(n, |s| { let mut i = 0; $(try!(s.emit_tuple_arg({ i+=1; i-1 }, |s| $name.encode(s)));)* Ok(()) }) } } peel! { $($name,)* } ) } tuple! { T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, } macro_rules! array { ($zero:expr) => (); ($len:expr, $($idx:expr),*) => { impl Decodable for [T; $len] { fn decode(d: &mut D) -> Result<[T; $len], D::Error> { d.read_seq(|d, len| { if len != $len { return Err(d.error("wrong array length")); } Ok([$( try!(d.read_seq_elt($len - $idx - 1, |d| Decodable::decode(d))) ),+]) }) } } impl Encodable for [T; $len] { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq($len, |s| { for i in 0..$len { try!(s.emit_seq_elt(i, |s| self[i].encode(s))); } Ok(()) }) } } array! { $($idx),* } } } array! { 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 } impl Encodable for Cell { fn encode(&self, s: &mut S) -> Result<(), S::Error> { self.get().encode(s) } } impl Decodable for Cell { fn decode(d: &mut D) -> Result, D::Error> { Ok(Cell::new(try!(Decodable::decode(d)))) } } // FIXME: #15036 // Should use `try_borrow`, returning a // `encoder.error("attempting to Encode borrowed RefCell")` // from `encode` when `try_borrow` returns `None`. impl Encodable for RefCell { fn encode(&self, s: &mut S) -> Result<(), S::Error> { self.borrow().encode(s) } } impl Decodable for RefCell { fn decode(d: &mut D) -> Result, D::Error> { Ok(RefCell::new(try!(Decodable::decode(d)))) } } impl Encodable for Arc { fn encode(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } impl Decodable for Arc { fn decode(d: &mut D) -> Result, D::Error> { Ok(Arc::new(try!(Decodable::decode(d)))) } } // ___________________________________________________________________________ // Helper routines /// Trait with helper functions for implementing `Encodable`. /// /// This trait is implemented for everything that implements `Encoder`. /// `Encodable` implementations can make use of it to make their implementations /// easier. pub trait EncoderHelpers: Encoder { /// Emit a vector as a sequence. /// /// Storing sequences as vectors is a common pattern. This method makes /// encoding such sequences easier by wrapping the calls to /// `Encoder::emit_seq` and `Encoder::emit_seq_elt`. /// /// # Examples /// /// ``` /// use rustc_serialize::Encodable; /// use rustc_serialize::Encoder; /// use rustc_serialize::EncoderHelpers; /// /// struct NumberSequence { /// elements: Vec, /// } /// /// impl Encodable for NumberSequence { /// fn encode(&self, s: &mut S) -> Result<(), S::Error> { /// s.emit_struct("NumberSequence", 1, |s| { /// s.emit_struct_field("elements", 0, |s| { /// s.emit_from_vec(&self.elements, |s,e| { /// s.emit_i32(*e) /// }) /// }) /// }) /// } /// } /// ``` fn emit_from_vec(&mut self, v: &[T], f: F) -> Result<(), ::Error> where F: FnMut(&mut Self, &T) -> Result<(), ::Error>; } impl EncoderHelpers for S { fn emit_from_vec(&mut self, v: &[T], mut f: F) -> Result<(), S::Error> where F: FnMut(&mut S, &T) -> Result<(), S::Error>, { self.emit_seq(v.len(), |this| { for (i, e) in v.iter().enumerate() { try!(this.emit_seq_elt(i, |this| { f(this, e) })); } Ok(()) }) } } /// Trait with helper functions for implementing `Decodable`. /// /// This trait is implemented for everything that implements `Decoder`. /// `Decodable` implementations can make use of it to make their implementations /// easier. pub trait DecoderHelpers: Decoder { /// Read a sequence into a vector. /// /// Storing sequences as vectors is a common pattern. This method makes /// deserializing such sequences easier by wrapping the calls to /// `Decoder::read_seq` and `Decoder::read_seq_elt`. /// /// # Examples /// /// ``` /// use rustc_serialize::Decodable; /// use rustc_serialize::Decoder; /// use rustc_serialize::DecoderHelpers; /// /// struct NumberSequence { /// elements: Vec, /// } /// /// impl Decodable for NumberSequence { /// fn decode(d: &mut D) -> Result { /// d.read_struct("NumberSequence", 2, |d| { /// Ok(NumberSequence{ /// elements: try!(d.read_struct_field("elements", 0, |d| { /// d.read_to_vec(|d| { d.read_i32() }) /// })) /// }) /// }) /// } /// } /// ``` fn read_to_vec(&mut self, f: F) -> Result, ::Error> where F: FnMut(&mut Self) -> Result::Error>; } impl DecoderHelpers for D { fn read_to_vec(&mut self, mut f: F) -> Result, D::Error> where F: FnMut(&mut D) -> Result, { self.read_seq(|this, len| { let mut v = Vec::with_capacity(cap_capacity::(len)); for i in 0..len { v.push(try!(this.read_seq_elt(i, |this| f(this)))); } Ok(v) }) } } #[test] #[allow(unused_variables)] fn capacity_rules() { use std::usize::MAX; use std::collections::{HashMap, HashSet}; struct MyDecoder; impl Decoder for MyDecoder { type Error = (); // Primitive types: fn read_nil(&mut self) -> Result<(), Self::Error> { Err(()) } fn read_usize(&mut self) -> Result { Err(()) } fn read_u64(&mut self) -> Result { Err(()) } fn read_u32(&mut self) -> Result { Err(()) } fn read_u16(&mut self) -> Result { Err(()) } fn read_u8(&mut self) -> Result { Err(()) } fn read_isize(&mut self) -> Result { Err(()) } fn read_i64(&mut self) -> Result { Err(()) } fn read_i32(&mut self) -> Result { Err(()) } fn read_i16(&mut self) -> Result { Err(()) } fn read_i8(&mut self) -> Result { Err(()) } fn read_bool(&mut self) -> Result { Err(()) } fn read_f64(&mut self) -> Result { Err(()) } fn read_f32(&mut self) -> Result { Err(()) } fn read_char(&mut self) -> Result { Err(()) } fn read_str(&mut self) -> Result { Err(()) } // Compound types: fn read_enum(&mut self, name: &str, f: F) -> Result where F: FnOnce(&mut Self) -> Result { Err(()) } fn read_enum_variant(&mut self, names: &[&str], f: F) -> Result where F: FnMut(&mut Self, usize) -> Result { Err(()) } fn read_enum_variant_arg(&mut self, a_idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result { Err(()) } fn read_enum_struct_variant(&mut self, names: &[&str], f: F) -> Result where F: FnMut(&mut Self, usize) -> Result { Err(()) } fn read_enum_struct_variant_field(&mut self, f_name: &str, f_idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result { Err(()) } fn read_struct(&mut self, s_name: &str, len: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result { Err(()) } fn read_struct_field(&mut self, f_name: &str, f_idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result { Err(()) } fn read_tuple(&mut self, len: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result { Err(()) } fn read_tuple_arg(&mut self, a_idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result { Err(()) } fn read_tuple_struct(&mut self, s_name: &str, len: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result { Err(()) } fn read_tuple_struct_arg(&mut self, a_idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result { Err(()) } // Specialized types: fn read_option(&mut self, f: F) -> Result where F: FnMut(&mut Self, bool) -> Result { Err(()) } fn read_seq(&mut self, f: F) -> Result where F: FnOnce(&mut Self, usize) -> Result { f(self, MAX) } fn read_seq_elt(&mut self, idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result { Err(()) } fn read_map(&mut self, f: F) -> Result where F: FnOnce(&mut Self, usize) -> Result { f(self, MAX) } fn read_map_elt_key(&mut self, idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result { Err(()) } fn read_map_elt_val(&mut self, idx: usize, f: F) -> Result where F: FnOnce(&mut Self) -> Result { Err(()) } // Failure fn error(&mut self, err: &str) -> Self::Error { () } } let mut dummy = MyDecoder; let vec_result: Result, ()> = Decodable::decode(&mut dummy); assert!(vec_result.is_err()); let map_result: Result, ()> = Decodable::decode(&mut dummy); assert!(map_result.is_err()); let set_result: Result, ()> = Decodable::decode(&mut dummy); assert!(set_result.is_err()); }