From 2626cf77cb9bd397a26dac1c662e731f03e258be Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 14 Jul 2016 15:28:51 +0200 Subject: adjust for seq/map ser revamp --- src/encoder/mod.rs | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) (limited to 'src/encoder/mod.rs') diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs index 304bac6..0f13b81 100644 --- a/src/encoder/mod.rs +++ b/src/encoder/mod.rs @@ -35,7 +35,7 @@ use {Value, Table}; /// assert_eq!(e.toml.get(&"foo".to_string()), Some(&Value::Integer(4))) /// # } /// ``` -#[derive(Default)] +#[derive(Default, Debug)] pub struct Encoder { /// Output TOML that is emitted. The current version of this encoder forces /// the top-level representation of a structure to be a table. @@ -66,8 +66,9 @@ pub enum Error { Custom(String), } -#[derive(PartialEq)] -enum State { +#[derive(PartialEq, Debug)] +#[doc(hidden)] +pub enum State { Start, NextKey(String), NextArray(Vec), @@ -115,8 +116,16 @@ impl Encoder { fn seq(&mut self, f: F) -> Result<(), Error> where F: FnOnce(&mut Encoder) -> Result<(), Error> { - let old = mem::replace(&mut self.state, State::NextArray(Vec::new())); + let old = try!(self.seq_begin()); try!(f(self)); + self.seq_end(old) + } + + fn seq_begin(&mut self) -> Result { + Ok(mem::replace(&mut self.state, State::NextArray(Vec::new()))) + } + + fn seq_end(&mut self, old: State) -> Result<(), Error> { match mem::replace(&mut self.state, old) { State::NextArray(v) => self.emit_value(Value::Array(v)), _ => unreachable!(), @@ -145,6 +154,30 @@ impl Encoder { } } + fn table_begin(&mut self) -> Result { + match self.state { + State::NextMapKey => Err(Error::InvalidMapKeyLocation), + _ => Ok(mem::replace(self, Encoder::new())) + } + } + + fn table_end(&mut self, mut state: Self) -> Result<(), Error> { + match state.state { + State::NextKey(key) => { + mem::swap(&mut self.toml, &mut state.toml); + self.toml.insert(key, Value::Table(state.toml)); + }, + State::NextArray(mut arr) => { + mem::swap(&mut self.toml, &mut state.toml); + arr.push(Value::Table(state.toml)); + self.state = State::NextArray(arr); + }, + State::Start => {}, + State::NextMapKey => unreachable!(), + } + Ok(()) + } + fn table_key(&mut self, f: F) -> Result<(), Error> where F: FnOnce(&mut Encoder) -> Result<(), Error> { -- cgit v1.2.3 From 86b9259616ed05fe32c5eee233b65e7934a76666 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 28 Jul 2016 11:08:39 -0700 Subject: Cfg off functions only needed for rustc-serialize or serde --- src/encoder/mod.rs | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/encoder/mod.rs') diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs index 0f13b81..fb00a47 100644 --- a/src/encoder/mod.rs +++ b/src/encoder/mod.rs @@ -113,6 +113,7 @@ impl Encoder { } } + #[cfg(feature = "rustc-serialize")] fn seq(&mut self, f: F) -> Result<(), Error> where F: FnOnce(&mut Encoder) -> Result<(), Error> { @@ -132,6 +133,7 @@ impl Encoder { } } + #[cfg(feature = "rustc-serialize")] fn table(&mut self, f: F) -> Result<(), Error> where F: FnOnce(&mut Encoder) -> Result<(), Error> { @@ -154,6 +156,7 @@ impl Encoder { } } + #[cfg(feature = "serde")] fn table_begin(&mut self) -> Result { match self.state { State::NextMapKey => Err(Error::InvalidMapKeyLocation), @@ -161,6 +164,7 @@ impl Encoder { } } + #[cfg(feature = "serde")] fn table_end(&mut self, mut state: Self) -> Result<(), Error> { match state.state { State::NextKey(key) => { -- cgit v1.2.3