Escape string containing colon

I don't know whether this is always necessary but it is required for
correctly serializing `["x: %"]`. If we serialize this without quotes to
`[x: %]` then the result is not valid YAML.
This commit is contained in:
David Tolnay 2018-09-15 12:20:11 -07:00
parent a60ece819a
commit 10498b2423
2 changed files with 26 additions and 2 deletions

View file

@ -301,11 +301,12 @@ fn need_quotes(string: &str) -> bool {
string == ""
|| need_quotes_spaces(string)
|| string.starts_with(|character: char| match character {
':' | '&' | '*' | '?' | '|' | '-' | '<' | '>' | '=' | '!' | '%' | '@' => true,
'&' | '*' | '?' | '|' | '-' | '<' | '>' | '=' | '!' | '%' | '@' => true,
_ => false,
})
|| string.contains(|character: char| match character {
'{'
':'
| '{'
| '}'
| '['
| ']'

View file

@ -0,0 +1,23 @@
extern crate yaml_rust;
use yaml_rust::{Yaml, YamlEmitter, YamlLoader};
fn test_round_trip(original: &Yaml) {
let mut out = String::new();
YamlEmitter::new(&mut out).dump(original).unwrap();
let documents = YamlLoader::load_from_str(&out).unwrap();
assert_eq!(documents.len(), 1);
assert_eq!(documents[0], *original);
}
#[test]
fn test_escape_character() {
let y = Yaml::String("\x1b".to_owned());
test_round_trip(&y);
}
#[test]
fn test_colon_in_string() {
let y = Yaml::String("x: %".to_owned());
test_round_trip(&y);
}