Skip to content

Commit 0b7497a

Browse files
committed
Merge branch 'master' of https://github.com/chyh1990/yaml-rust into chyh1990
2 parents 629daa2 + d9024de commit 0b7497a

File tree

5 files changed

+213
-64
lines changed

5 files changed

+213
-64
lines changed

Diff for: Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "yaml-rust"
3-
version = "0.3.5"
3+
version = "0.3.6"
44
authors = ["Yuheng Chen <[email protected]>"]
55
homepage = "http://chyh1990.github.io/yaml-rust/"
66
documentation = "http://chyh1990.github.io/yaml-rust/doc/yaml_rust/"

Diff for: src/emitter.rs

+149-16
Original file line numberDiff line numberDiff line change
@@ -302,17 +302,20 @@ fn need_quotes(string: &str) -> bool {
302302
_ => false,
303303
}
304304
})
305-
|| string == "true"
306-
|| string == "false"
307-
|| string == "null"
308-
|| string == "~"
305+
|| [// http://yaml.org/type/bool.html
306+
"y","Y","yes","Yes","YES","n","N","no","No","NO",
307+
"True", "TRUE", "true", "False", "FALSE", "false",
308+
"on","On","ON","off","Off","OFF",
309+
// http://yaml.org/type/null.html
310+
"null","Null","NULL", "~"
311+
].contains(&string)
309312
|| string.starts_with('.')
310313
|| string.parse::<i64>().is_ok()
311314
|| string.parse::<f64>().is_ok()
312315
}
313316

314317
#[cfg(test)]
315-
mod tests {
318+
mod test {
316319
use super::*;
317320
use YamlLoader;
318321

@@ -327,15 +330,8 @@ a1:
327330
a2: 4 # i'm comment
328331
a3: [1, 2, 3]
329332
a4:
330-
- - a1
331-
- a2
333+
- [a1, a2]
332334
- 2
333-
- []
334-
- {}
335-
a5: 'single_quoted'
336-
a6: \"double_quoted\"
337-
a7: 你好
338-
'key 1': \"ddd\\\tbbb\"
339335
";
340336

341337

@@ -346,7 +342,12 @@ a7: 你好
346342
let mut emitter = YamlEmitter::new(&mut writer);
347343
emitter.dump(doc).unwrap();
348344
}
349-
let docs_new = YamlLoader::load_from_str(&s).unwrap();
345+
println!("original:\n{}", s);
346+
println!("emitted:\n{}", writer);
347+
let docs_new = match YamlLoader::load_from_str(&writer) {
348+
Ok(y) => y,
349+
Err(e) => panic!(format!("{}", e))
350+
};
350351
let doc_new = &docs_new[0];
351352

352353
assert_eq!(doc, doc_new);
@@ -380,7 +381,10 @@ products:
380381
let mut emitter = YamlEmitter::new(&mut writer);
381382
emitter.dump(doc).unwrap();
382383
}
383-
let docs_new = YamlLoader::load_from_str(&s).unwrap();
384+
let docs_new = match YamlLoader::load_from_str(&writer) {
385+
Ok(y) => y,
386+
Err(e) => panic!(format!("{}", e))
387+
};
384388
let doc_new = &docs_new[0];
385389
assert_eq!(doc, doc_new);
386390
}
@@ -417,7 +421,8 @@ products:
417421
"true": bool key
418422
"{}": empty hash key
419423
x: test
420-
y: string with spaces"#;
424+
"y": "can't avoid quoting here"
425+
z: string with spaces"#;
421426

422427
let docs = YamlLoader::load_from_str(&s).unwrap();
423428
let doc = &docs[0];
@@ -430,6 +435,64 @@ y: string with spaces"#;
430435
assert_eq!(s, writer, "actual:\n\n{}\n", writer);
431436
}
432437

438+
#[test]
439+
fn emit_quoted_bools() {
440+
let input = r#"---
441+
string0: yes
442+
string1: no
443+
string2: "true"
444+
string3: "false"
445+
string4: "~"
446+
null0: ~
447+
[true, false]: real_bools
448+
[True, TRUE, False, FALSE, y,Y,yes,Yes,YES,n,N,no,No,NO,on,On,ON,off,Off,OFF]: false_bools
449+
bool0: true
450+
bool1: false"#;
451+
let expected = r#"---
452+
string0: "yes"
453+
string1: "no"
454+
string2: "true"
455+
string3: "false"
456+
string4: "~"
457+
null0: ~
458+
? - true
459+
- false
460+
: real_bools
461+
? - "True"
462+
- "TRUE"
463+
- "False"
464+
- "FALSE"
465+
- "y"
466+
- "Y"
467+
- "yes"
468+
- "Yes"
469+
- "YES"
470+
- "n"
471+
- "N"
472+
- "no"
473+
- "No"
474+
- "NO"
475+
- "on"
476+
- "On"
477+
- "ON"
478+
- "off"
479+
- "Off"
480+
- "OFF"
481+
: false_bools
482+
bool0: true
483+
bool1: false"#;
484+
485+
let docs = YamlLoader::load_from_str(&input).unwrap();
486+
let doc = &docs[0];
487+
let mut writer = String::new();
488+
{
489+
let mut emitter = YamlEmitter::new(&mut writer);
490+
emitter.dump(doc).unwrap();
491+
}
492+
493+
assert_eq!(expected, writer, "actual:\n\n{}\n", writer);
494+
}
495+
433496
#[test]
434497
fn test_empty_and_nested() {
435498
test_empty_and_nested_flag(false)
@@ -471,4 +534,74 @@ e:
471534

472535
assert_eq!(s, writer);
473536
}
537+
538+
#[test]
539+
fn test_nested_arrays() {
540+
let s = r#"---
541+
a:
542+
- b
543+
- - c
544+
- d
545+
- - e
546+
- f"#;
547+
548+
let docs = YamlLoader::load_from_str(&s).unwrap();
549+
let doc = &docs[0];
550+
let mut writer = String::new();
551+
{
552+
let mut emitter = YamlEmitter::new(&mut writer);
553+
emitter.dump(doc).unwrap();
554+
}
555+
println!("original:\n{}", s);
556+
println!("emitted:\n{}", writer);
557+
558+
assert_eq!(s, writer);
559+
}
560+
561+
#[test]
562+
fn test_deeply_nested_arrays() {
563+
let s = r#"---
564+
a:
565+
- b
566+
- - c
567+
- d
568+
- - e
569+
- - f
570+
- - e"#;
571+
572+
let docs = YamlLoader::load_from_str(&s).unwrap();
573+
let doc = &docs[0];
574+
let mut writer = String::new();
575+
{
576+
let mut emitter = YamlEmitter::new(&mut writer);
577+
emitter.dump(doc).unwrap();
578+
}
579+
println!("original:\n{}", s);
580+
println!("emitted:\n{}", writer);
581+
582+
assert_eq!(s, writer);
583+
}
584+
585+
#[test]
586+
fn test_nested_hashes() {
587+
let s = r#"---
588+
a:
589+
b:
590+
c:
591+
d:
592+
e: f"#;
593+
594+
let docs = YamlLoader::load_from_str(&s).unwrap();
595+
let doc = &docs[0];
596+
let mut writer = String::new();
597+
{
598+
let mut emitter = YamlEmitter::new(&mut writer);
599+
emitter.dump(doc).unwrap();
600+
}
601+
println!("original:\n{}", s);
602+
println!("emitted:\n{}", writer);
603+
604+
assert_eq!(s, writer);
605+
}
606+
474607
}

Diff for: src/parser.rs

+44-35
Original file line numberDiff line numberDiff line change
@@ -76,22 +76,20 @@ pub struct Parser<T> {
7676

7777

7878
pub trait EventReceiver {
79-
fn on_event(&mut self, ev: &Event);
79+
fn on_event(&mut self, ev: Event);
8080
}
8181

8282

8383
pub trait MarkedEventReceiver {
84-
fn on_event(&mut self, ev: &Event, _mark: Marker);
84+
fn on_event(&mut self, ev: Event, _mark: Marker);
8585
}
8686

8787
impl<R: EventReceiver> MarkedEventReceiver for R {
88-
fn on_event(&mut self, ev: &Event, _mark: Marker) {
88+
fn on_event(&mut self, ev: Event, _mark: Marker) {
8989
self.on_event(ev)
9090
}
9191
}
9292

93-
94-
9593
pub type ParseResult = Result<(Event, Marker), ScanError>;
9694

9795
impl<T: Iterator<Item=char>> Parser<T> {
@@ -136,102 +134,113 @@ impl<T: Iterator<Item=char>> Parser<T> {
136134
self.states.push(state);
137135
}
138136

139-
fn parse<R: MarkedEventReceiver>(&mut self, recv: &mut R)
140-
-> Result<Event, ScanError> {
137+
fn parse(&mut self) -> ParseResult {
141138
if self.state == State::End {
142-
return Ok(Event::StreamEnd);
139+
return Ok((Event::StreamEnd, self.scanner.mark()));
143140
}
144141
let (ev, mark) = try!(self.state_machine());
145142
// println!("EV {:?}", ev);
146-
recv.on_event(&ev, mark);
147-
Ok(ev)
143+
Ok((ev, mark))
148144
}
149145

150146
pub fn load<R: MarkedEventReceiver>(&mut self, recv: &mut R, multi: bool)
151147
-> Result<(), ScanError> {
152148
if !self.scanner.stream_started() {
153-
let ev = try!(self.parse(recv));
149+
let (ev, mark) = try!(self.parse());
154150
assert_eq!(ev, Event::StreamStart);
151+
recv.on_event(ev, mark);
155152
}
156153

157154
if self.scanner.stream_ended() {
158155
// XXX has parsed?
159-
recv.on_event(&Event::StreamEnd, self.scanner.mark());
156+
recv.on_event(Event::StreamEnd, self.scanner.mark());
160157
return Ok(());
161158
}
162159
loop {
163-
let ev = try!(self.parse(recv));
160+
let (ev, mark) = try!(self.parse());
164161
if ev == Event::StreamEnd {
165-
recv.on_event(&Event::StreamEnd, self.scanner.mark());
162+
recv.on_event(ev, mark);
166163
return Ok(());
167164
}
168165
// clear anchors before a new document
169166
self.anchors.clear();
170-
try!(self.load_document(&ev, recv));
167+
try!(self.load_document(ev, mark, recv));
171168
if !multi {
172169
break;
173170
}
174171
}
175172
Ok(())
176173
}
177174

178-
fn load_document<R: MarkedEventReceiver>(&mut self, first_ev: &Event, recv: &mut R)
175+
fn load_document<R: MarkedEventReceiver>(&mut self, first_ev: Event, mark: Marker, recv: &mut R)
179176
-> Result<(), ScanError> {
180-
assert_eq!(first_ev, &Event::DocumentStart);
177+
assert_eq!(first_ev, Event::DocumentStart);
178+
recv.on_event(first_ev, mark);
181179

182-
let ev = try!(self.parse(recv));
183-
try!(self.load_node(&ev, recv));
180+
let (ev, mark) = try!(self.parse());
181+
try!(self.load_node(ev, mark, recv));
184182

185183
// DOCUMENT-END is expected.
186-
let ev = try!(self.parse(recv));
184+
let (ev, mark) = try!(self.parse());
187185
assert_eq!(ev, Event::DocumentEnd);
186+
recv.on_event(ev, mark);
188187

189188
Ok(())
190189
}
191190

192-
fn load_node<R: MarkedEventReceiver>(&mut self, first_ev: &Event, recv: &mut R)
191+
fn load_node<R: MarkedEventReceiver>(&mut self, first_ev: Event, mark: Marker, recv: &mut R)
193192
-> Result<(), ScanError> {
194-
match *first_ev {
193+
match first_ev {
195194
Event::Alias(..) | Event::Scalar(..) => {
195+
recv.on_event(first_ev, mark);
196196
Ok(())
197197
},
198198
Event::SequenceStart(_) => {
199-
self.load_sequence(first_ev, recv)
199+
recv.on_event(first_ev, mark);
200+
self.load_sequence(recv)
200201
},
201202
Event::MappingStart(_) => {
202-
self.load_mapping(first_ev, recv)
203+
recv.on_event(first_ev, mark);
204+
self.load_mapping(recv)
203205
},
204206
_ => { println!("UNREACHABLE EVENT: {:?}", first_ev);
205207
unreachable!(); }
206208
}
207209
}
208210

209-
fn load_mapping<R: MarkedEventReceiver>(&mut self, _first_ev: &Event, recv: &mut R)
211+
fn load_mapping<R: MarkedEventReceiver>(&mut self, recv: &mut R)
210212
-> Result<(), ScanError> {
211-
let mut ev = try!(self.parse(recv));
212-
while ev != Event::MappingEnd {
213+
let (mut key_ev, mut key_mark) = try!(self.parse());
214+
while key_ev != Event::MappingEnd {
213215
// key
214-
try!(self.load_node(&ev, recv));
216+
try!(self.load_node(key_ev, key_mark, recv));
215217

216218
// value
217-
ev = try!(self.parse(recv));
218-
try!(self.load_node(&ev, recv));
219+
let (ev, mark) = try!(self.parse());
220+
try!(self.load_node(ev, mark, recv));
219221

220222
// next event
221-
ev = try!(self.parse(recv));
223+
let (ev, mark) = try!(self.parse());
224+
key_ev = ev;
225+
key_mark = mark;
226+
222227
}
228+
recv.on_event(key_ev, key_mark);
223229
Ok(())
224230
}
225231

226-
fn load_sequence<R: MarkedEventReceiver>(&mut self, _first_ev: &Event, recv: &mut R)
232+
fn load_sequence<R: MarkedEventReceiver>(&mut self, recv: &mut R)
227233
-> Result<(), ScanError> {
228-
let mut ev = try!(self.parse(recv));
234+
let (mut ev, mut mark) = try!(self.parse());
229235
while ev != Event::SequenceEnd {
230-
try!(self.load_node(&ev, recv));
236+
try!(self.load_node(ev, mark, recv));
231237

232238
// next event
233-
ev = try!(self.parse(recv));
239+
let (next_ev, next_mark) = try!(self.parse());
240+
ev = next_ev;
241+
mark = next_mark;
234242
}
243+
recv.on_event(ev, mark);
235244
Ok(())
236245
}
237246

0 commit comments

Comments
 (0)