diff options
author | Alex Crichton <alex@alexcrichton.com> | 2016-07-29 10:23:06 -0700 |
---|---|---|
committer | Alex Crichton <alex@alexcrichton.com> | 2016-07-29 10:23:06 -0700 |
commit | dd109bc9e9b8a6a5585e8bf1093ec84dcad61309 (patch) | |
tree | 35dce7c6c595cdc415f478a1bd7d5290ad221205 /src/encoder/rustc_serialize.rs | |
parent | 456cd1c7aa86896b0e87a7a995eefcd65ef79b01 (diff) | |
download | milf-rs-dd109bc9e9b8a6a5585e8bf1093ec84dcad61309.tar.gz milf-rs-dd109bc9e9b8a6a5585e8bf1093ec84dcad61309.zip |
Touch up the encoder/decoder a bit
* Whitespace things
* Don't make `State` public
* Remove `#[cfg]` annotations
Diffstat (limited to 'src/encoder/rustc_serialize.rs')
-rw-r--r-- | src/encoder/rustc_serialize.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/encoder/rustc_serialize.rs b/src/encoder/rustc_serialize.rs index 6dce66a..0eda740 100644 --- a/src/encoder/rustc_serialize.rs +++ b/src/encoder/rustc_serialize.rs @@ -5,6 +5,38 @@ use Value; use super::{Encoder, Error, State}; use super::Error::*; +impl Encoder { + fn table<F>(&mut self, f: F) -> Result<(), Error> + where F: FnOnce(&mut Encoder) -> Result<(), Error> + { + match mem::replace(&mut self.state, State::Start) { + State::NextKey(key) => { + let mut nested = Encoder::new(); + try!(f(&mut nested)); + self.toml.insert(key, Value::Table(nested.toml)); + Ok(()) + } + State::NextArray(mut arr) => { + let mut nested = Encoder::new(); + try!(f(&mut nested)); + arr.push(Value::Table(nested.toml)); + self.state = State::NextArray(arr); + Ok(()) + } + State::Start => f(self), + State::NextMapKey => Err(Error::InvalidMapKeyLocation), + } + } + + fn seq<F>(&mut self, f: F) -> Result<(), Error> + where F: FnOnce(&mut Encoder) -> Result<(), Error> + { + let old = try!(self.seq_begin()); + try!(f(self)); + self.seq_end(old) + } +} + impl rustc_serialize::Encoder for Encoder { type Error = Error; |