aboutsummaryrefslogtreecommitdiff
path: root/src/encoder/rustc_serialize.rs
diff options
context:
space:
mode:
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;