Do not emit trailing whitespace
This commit is contained in:
parent
ed6ad8d6f0
commit
d0423912bb
1 changed files with 97 additions and 54 deletions
|
@ -1,6 +1,6 @@
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::convert::From;
|
use std::convert::From;
|
||||||
use yaml::Yaml;
|
use yaml::{Array, Hash, Yaml};
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
pub enum EmitError {
|
pub enum EmitError {
|
||||||
|
@ -151,61 +151,14 @@ impl<'a> YamlEmitter<'a> {
|
||||||
self.level -= 1;
|
self.level -= 1;
|
||||||
Ok(())
|
Ok(())
|
||||||
},
|
},
|
||||||
_ => self.emit_node(node)
|
_ => self.emit_node(node),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_node(&mut self, node: &Yaml) -> EmitResult {
|
fn emit_node(&mut self, node: &Yaml) -> EmitResult {
|
||||||
match *node {
|
match *node {
|
||||||
Yaml::Array(ref v) => {
|
Yaml::Array(ref v) => self.emit_array(v),
|
||||||
if v.is_empty() {
|
Yaml::Hash(ref h) => self.emit_hash(h),
|
||||||
try!(write!(self.writer, "[]"));
|
|
||||||
Ok(())
|
|
||||||
} else {
|
|
||||||
if self.level >= 0 {
|
|
||||||
try!(write!(self.writer, "\n"));
|
|
||||||
}
|
|
||||||
self.level += 1;
|
|
||||||
for (cnt, x) in v.iter().enumerate() {
|
|
||||||
if cnt > 0 {
|
|
||||||
try!(write!(self.writer, "\n"));
|
|
||||||
}
|
|
||||||
try!(self.write_indent());
|
|
||||||
try!(write!(self.writer, "- "));
|
|
||||||
try!(self.emit_node(x));
|
|
||||||
}
|
|
||||||
self.level -= 1;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Yaml::Hash(ref h) => {
|
|
||||||
if h.is_empty() {
|
|
||||||
try!(self.writer.write_str("{}"));
|
|
||||||
Ok(())
|
|
||||||
} else {
|
|
||||||
if self.level >= 0 {
|
|
||||||
try!(write!(self.writer, "\n"));
|
|
||||||
}
|
|
||||||
self.level += 1;
|
|
||||||
for (cnt, (k, v)) in h.iter().enumerate() {
|
|
||||||
if cnt > 0 {
|
|
||||||
try!(write!(self.writer, "\n"));
|
|
||||||
}
|
|
||||||
try!(self.write_indent());
|
|
||||||
match *k {
|
|
||||||
Yaml::Array(_) | Yaml::Hash(_) => {
|
|
||||||
try!(self.emit_node_compact(k));
|
|
||||||
//return Err(EmitError::BadHashmapKey);
|
|
||||||
},
|
|
||||||
_ => { try!(self.emit_node(k)); }
|
|
||||||
}
|
|
||||||
try!(write!(self.writer, ": "));
|
|
||||||
try!(self.emit_node(v));
|
|
||||||
}
|
|
||||||
self.level -= 1;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Yaml::String(ref v) => {
|
Yaml::String(ref v) => {
|
||||||
if need_quotes(v) {
|
if need_quotes(v) {
|
||||||
try!(escape_str(self.writer, v));
|
try!(escape_str(self.writer, v));
|
||||||
|
@ -239,6 +192,73 @@ impl<'a> YamlEmitter<'a> {
|
||||||
_ => { Ok(()) }
|
_ => { Ok(()) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn emit_array(&mut self, v: &Array) -> EmitResult {
|
||||||
|
if v.is_empty() {
|
||||||
|
try!(write!(self.writer, "[]"));
|
||||||
|
} else {
|
||||||
|
for (cnt, x) in v.iter().enumerate() {
|
||||||
|
if cnt > 0 {
|
||||||
|
try!(write!(self.writer, "\n"));
|
||||||
|
}
|
||||||
|
try!(self.write_indent());
|
||||||
|
self.level += 1;
|
||||||
|
try!(write!(self.writer, "- "));
|
||||||
|
try!(self.emit_node(x));
|
||||||
|
self.level -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn emit_hash(&mut self, h: &Hash) -> EmitResult {
|
||||||
|
if h.is_empty() {
|
||||||
|
try!(self.writer.write_str("{}"));
|
||||||
|
} else {
|
||||||
|
self.level += 1;
|
||||||
|
for (cnt, (k, v)) in h.iter().enumerate() {
|
||||||
|
if cnt > 0 {
|
||||||
|
try!(write!(self.writer, "\n"));
|
||||||
|
try!(self.write_indent());
|
||||||
|
}
|
||||||
|
match *k {
|
||||||
|
Yaml::Array(_) | Yaml::Hash(_) => {
|
||||||
|
try!(self.emit_node_compact(k));
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
try!(self.emit_node(k));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match *v {
|
||||||
|
Yaml::Array(ref v) => {
|
||||||
|
if v.is_empty() {
|
||||||
|
try!(write!(self.writer, ": "));
|
||||||
|
} else {
|
||||||
|
try!(write!(self.writer, ":\n"));
|
||||||
|
}
|
||||||
|
try!(self.emit_array(v));
|
||||||
|
}
|
||||||
|
Yaml::Hash(ref h) => {
|
||||||
|
if h.is_empty() {
|
||||||
|
try!(write!(self.writer, ": "));
|
||||||
|
} else {
|
||||||
|
try!(write!(self.writer, ":\n"));
|
||||||
|
self.level += 1;
|
||||||
|
try!(self.write_indent());
|
||||||
|
self.level -= 1;
|
||||||
|
}
|
||||||
|
try!(self.emit_hash(h));
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
try!(write!(self.writer, ": "));
|
||||||
|
try!(self.emit_node(v));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.level -= 1;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check if the string requires quoting.
|
/// Check if the string requires quoting.
|
||||||
|
@ -389,6 +409,29 @@ y: string with spaces"#;
|
||||||
emitter.dump(doc).unwrap();
|
emitter.dump(doc).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert_eq!(s, writer, "actual:\n\n{}\n", writer);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_empty_and_nested() {
|
||||||
|
let s = r#"---
|
||||||
|
a:
|
||||||
|
b:
|
||||||
|
c: hello
|
||||||
|
d: {}
|
||||||
|
e:
|
||||||
|
- f
|
||||||
|
- g
|
||||||
|
- h: []"#;
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
assert_eq!(s, writer);
|
assert_eq!(s, writer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue