diff options
author | Oliver Schneider <git-spam-no-reply9815368754983@oli-obk.de> | 2016-07-14 15:28:51 +0200 |
---|---|---|
committer | Oliver Schneider <git-spam-no-reply9815368754983@oli-obk.de> | 2016-07-14 15:28:51 +0200 |
commit | 2626cf77cb9bd397a26dac1c662e731f03e258be (patch) | |
tree | 9cfdae8fe647ecb7762915b9a8d000299be0e088 /src/encoder/mod.rs | |
parent | fb8050d2d556dd613971f15e7bd73cfd43acad82 (diff) | |
download | milf-rs-2626cf77cb9bd397a26dac1c662e731f03e258be.tar.gz milf-rs-2626cf77cb9bd397a26dac1c662e731f03e258be.zip |
adjust for seq/map ser revamp
Diffstat (limited to 'src/encoder/mod.rs')
-rw-r--r-- | src/encoder/mod.rs | 41 |
1 files changed, 37 insertions, 4 deletions
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<Value>), @@ -115,8 +116,16 @@ impl Encoder { fn seq<F>(&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<State, Error> { + 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<Self, Error> { + 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<F>(&mut self, f: F) -> Result<(), Error> where F: FnOnce(&mut Encoder) -> Result<(), Error> { |