quoting possible booleans

fixes #53
This commit is contained in:
Hendrik Sollich 2017-05-22 19:30:01 +02:00
parent b5f5b66d6e
commit 3fa9a24739
2 changed files with 48 additions and 12 deletions

View file

@ -1,6 +1,6 @@
[package] [package]
name = "yaml-rust" name = "yaml-rust"
version = "0.3.5" version = "0.3.6"
authors = ["Yuheng Chen <yuhengchen@sensetime.com>"] authors = ["Yuheng Chen <yuhengchen@sensetime.com>"]
homepage = "http://chyh1990.github.io/yaml-rust/" homepage = "http://chyh1990.github.io/yaml-rust/"
documentation = "http://chyh1990.github.io/yaml-rust/doc/yaml_rust/" documentation = "http://chyh1990.github.io/yaml-rust/doc/yaml_rust/"

View file

@ -137,15 +137,12 @@ impl<'a> YamlEmitter<'a> {
Yaml::Array(ref v) => { Yaml::Array(ref v) => {
try!(write!(self.writer, "[")); try!(write!(self.writer, "["));
if self.level >= 0 { if self.level >= 0 {
try!(write!(self.writer, "+ ")); try!(write!(self.writer, ""));
} }
self.level += 1;
for (cnt, x) in v.iter().enumerate() { for (cnt, x) in v.iter().enumerate() {
try!(self.write_indent());
if cnt > 0 { try!(write!(self.writer, ", ")); } if cnt > 0 { try!(write!(self.writer, ", ")); }
try!(self.emit_node(x)); try!(self.emit_node(x));
} }
self.level -= 1;
try!(write!(self.writer, "]")); try!(write!(self.writer, "]"));
Ok(()) Ok(())
}, },
@ -181,8 +178,7 @@ impl<'a> YamlEmitter<'a> {
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));
} } else {
else {
try!(write!(self.writer, "{}", v)); try!(write!(self.writer, "{}", v));
} }
Ok(()) Ok(())
@ -306,10 +302,13 @@ fn need_quotes(string: &str) -> bool {
_ => false, _ => false,
} }
}) })
|| string == "true" || [// http://yaml.org/type/bool.html
|| string == "false" "y","Y","yes","Yes","YES","n","N","no","No","NO",
|| string == "null" "True", "TRUE", "true", "False", "FALSE", "false",
|| string == "~" "on","On","ON","off","Off","OFF",
// http://yaml.org/type/null.html
"null","Null","NULL", "~"
].contains(&string)
|| string.starts_with('.') || string.starts_with('.')
|| string.parse::<i64>().is_ok() || string.parse::<i64>().is_ok()
|| string.parse::<f64>().is_ok() || string.parse::<f64>().is_ok()
@ -421,7 +420,8 @@ products:
"true": bool key "true": bool key
"{}": empty hash key "{}": empty hash key
x: test x: test
y: string with spaces"#; "y": "can't avoid quoting here"
z: string with spaces"#;
let docs = YamlLoader::load_from_str(&s).unwrap(); let docs = YamlLoader::load_from_str(&s).unwrap();
let doc = &docs[0]; let doc = &docs[0];
@ -434,6 +434,42 @@ y: string with spaces"#;
assert_eq!(s, writer, "actual:\n\n{}\n", writer); assert_eq!(s, writer, "actual:\n\n{}\n", writer);
} }
#[test]
fn emit_quoted_bools() {
let input = r#"---
string0: yes
string1: no
string2: "true"
string3: "false"
string4: "~"
null0: ~
[true, false]: real_bools
[True, TRUE, False, FALSE, y,Y,yes,Yes,YES,n,N,no,No,NO,on,On,ON,off,Off,OFF]: false_bools
bool0: true
bool1: false"#;
let expected = r#"---
string0: "yes"
string1: "no"
string2: "true"
string3: "false"
string4: "~"
null0: ~
[true, false]: real_bools
["True", "TRUE", "False", "FALSE", "y", "Y", "yes", "Yes", "YES", "n", "N", "no", "No", "NO", "on", "On", "ON", "off", "Off", "OFF"]: false_bools
bool0: true
bool1: false"#;
let docs = YamlLoader::load_from_str(&input).unwrap();
let doc = &docs[0];
let mut writer = String::new();
{
let mut emitter = YamlEmitter::new(&mut writer);
emitter.dump(doc).unwrap();
}
assert_eq!(expected, writer, "actual:\n\n{}\n", writer);
}
#[test] #[test]
fn test_empty_and_nested() { fn test_empty_and_nested() {
let s = r#"--- let s = r#"---