From 53b5936a81442ea733b436e9ce6eec78d78e5352 Mon Sep 17 00:00:00 2001 From: Hendrik Sollich Date: Fri, 16 Sep 2016 20:06:50 +0200 Subject: [PATCH 1/2] fixed: emitter also emits complex keys --- parser/src/emitter.rs | 46 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/parser/src/emitter.rs b/parser/src/emitter.rs index fe9a6e1..2ee7b98 100644 --- a/parser/src/emitter.rs +++ b/parser/src/emitter.rs @@ -113,6 +113,48 @@ impl<'a> YamlEmitter<'a> { Ok(()) } + fn emit_node_compact(&mut self, node: &Yaml) -> EmitResult { + match *node { + Yaml::Array(ref v) => { + try!(write!(self.writer, "[")); + if self.level >= 0 { + try!(write!(self.writer, "+ ")); + } + self.level += 1; + for (cnt, x) in v.iter().enumerate() { + try!(self.write_indent()); + if cnt > 0 { try!(write!(self.writer, ", ")); } + try!(self.emit_node(x)); + } + self.level -= 1; + try!(write!(self.writer, "]")); + Ok(()) + }, + Yaml::Hash(ref h) => { + try!(self.writer.write_str("{")); + self.level += 1; + for (cnt, (k, v)) in h.iter().enumerate() { + if cnt > 0 { + try!(write!(self.writer, ", ")); + } + match *k { + // complex key is not supported + Yaml::Array(_) | Yaml::Hash(_) => { + return Err(EmitError::BadHashmapKey); + }, + _ => { try!(self.emit_node(k)); } + } + try!(write!(self.writer, ": ")); + try!(self.emit_node(v)); + } + try!(self.writer.write_str("}")); + self.level -= 1; + Ok(()) + }, + _ => self.emit_node(node) + } + } + fn emit_node(&mut self, node: &Yaml) -> EmitResult { match *node { Yaml::Array(ref v) => { @@ -151,9 +193,9 @@ impl<'a> YamlEmitter<'a> { } try!(self.write_indent()); match *k { - // complex key is not supported Yaml::Array(_) | Yaml::Hash(_) => { - return Err(EmitError::BadHashmapKey); + try!(self.emit_node_compact(k)); + //return Err(EmitError::BadHashmapKey); }, _ => { try!(self.emit_node(k)); } } From 95f414a8efffe5d8ffe2615dcb90ba33a17cbe9f Mon Sep 17 00:00:00 2001 From: Hendrik Sollich Date: Thu, 22 Sep 2016 14:17:42 +0200 Subject: [PATCH 2/2] added test for emitting equivalence of complex keys --- parser/src/emitter.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/parser/src/emitter.rs b/parser/src/emitter.rs index 2ee7b98..0631ec2 100644 --- a/parser/src/emitter.rs +++ b/parser/src/emitter.rs @@ -263,6 +263,7 @@ a7: 你好 'key 1': \"ddd\\\tbbb\" "; + let docs = YamlLoader::load_from_str(&s).unwrap(); let doc = &docs[0]; let mut writer = String::new(); @@ -275,4 +276,37 @@ a7: 你好 assert_eq!(doc, doc_new); } + + #[test] + fn test_emit_complex() { + let s = r#" +cataloge: + product: &coffee { name: Coffee, price: 2.5 , unit: 1l } + product: &cookies { name: Cookies!, price: 3.40 , unit: 400g} + +products: + *coffee: + amount: 4 + *cookies: + amount: 4 + [1,2,3,4]: + array key + 2.4: + real key + true: + bool key + {}: + empty hash key + "#; + let docs = YamlLoader::load_from_str(&s).unwrap(); + let doc = &docs[0]; + let mut writer = String::new(); + { + let mut emitter = YamlEmitter::new(&mut writer); + emitter.dump(doc).unwrap(); + } + let docs_new = YamlLoader::load_from_str(&s).unwrap(); + let doc_new = &docs_new[0]; + assert_eq!(doc, doc_new); + } }