aboutsummaryrefslogtreecommitdiff
path: root/src/encoder/rustc_serialize.rs
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2016-07-29 10:23:06 -0700
committerAlex Crichton <alex@alexcrichton.com>2016-07-29 10:23:06 -0700
commitdd109bc9e9b8a6a5585e8bf1093ec84dcad61309 (patch)
tree35dce7c6c595cdc415f478a1bd7d5290ad221205 /src/encoder/rustc_serialize.rs
parent456cd1c7aa86896b0e87a7a995eefcd65ef79b01 (diff)
downloadmilf-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.rs32
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;