implement IntoIterator for Yaml

This commit is contained in:
Matthew Piziak 2016-08-08 17:31:36 -04:00
parent 2c520ebead
commit 3adfd05000

View file

@ -339,6 +339,30 @@ impl Index<usize> for Yaml {
} }
} }
impl IntoIterator for Yaml {
type Item = Yaml;
type IntoIter = YamlIter;
fn into_iter(self) -> Self::IntoIter {
YamlIter {yaml: self, index: 0}
}
}
pub struct YamlIter {
yaml: Yaml,
index: usize,
}
impl Iterator for YamlIter {
type Item = Yaml;
fn next(&mut self) -> Option<Yaml> {
let result = self.yaml[self.index].clone();
self.index += 1;
Some(result)
}
}
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use yaml::*; use yaml::*;
@ -539,33 +563,27 @@ a1: &DEFAULT
- !!bool false - !!bool false
- 0xFF - 0xFF
- 0o77 - 0o77
- [ 0xF, 0xF ]
- +12345 - +12345
- [ true, false ]
"; ";
let out = YamlLoader::load_from_str(&s).unwrap(); let mut out = YamlLoader::load_from_str(&s).unwrap().into_iter();
let doc = &out[0]; let mut doc = out.next().unwrap().into_iter();
assert_eq!(doc[0].clone().into_string().unwrap(), "string"); assert_eq!(doc.next().unwrap().into_string().unwrap(), "string");
assert_eq!(doc[1].clone().into_string().unwrap(), "string"); assert_eq!(doc.next().unwrap().into_string().unwrap(), "string");
assert_eq!(doc[2].clone().into_string().unwrap(), "string"); assert_eq!(doc.next().unwrap().into_string().unwrap(), "string");
assert_eq!(doc[3].clone().into_i64().unwrap(), 123); assert_eq!(doc.next().unwrap().into_i64().unwrap(), 123);
assert_eq!(doc[4].clone().into_i64().unwrap(), -321); assert_eq!(doc.next().unwrap().into_i64().unwrap(), -321);
assert_eq!(doc[5].clone().into_f64().unwrap(), 1.23); assert_eq!(doc.next().unwrap().into_f64().unwrap(), 1.23);
assert_eq!(doc[6].clone().into_f64().unwrap(), -1e4); assert_eq!(doc.next().unwrap().into_f64().unwrap(), -1e4);
assert_eq!(doc[7].clone().into_bool().unwrap(), true); assert_eq!(doc.next().unwrap().into_bool().unwrap(), true);
assert_eq!(doc[8].clone().into_bool().unwrap(), false); assert_eq!(doc.next().unwrap().into_bool().unwrap(), false);
assert_eq!(doc[9].clone().into_string().unwrap(), "0"); assert_eq!(doc.next().unwrap().into_string().unwrap(), "0");
assert_eq!(doc[10].clone().into_i64().unwrap(), 100); assert_eq!(doc.next().unwrap().into_i64().unwrap(), 100);
assert_eq!(doc[11].clone().into_f64().unwrap(), 2.0); assert_eq!(doc.next().unwrap().into_f64().unwrap(), 2.0);
assert_eq!(doc[12].clone().into_bool().unwrap(), true); assert_eq!(doc.next().unwrap().into_bool().unwrap(), true);
assert_eq!(doc[13].clone().into_bool().unwrap(), false); assert_eq!(doc.next().unwrap().into_bool().unwrap(), false);
assert_eq!(doc[14].clone().into_i64().unwrap(), 255); assert_eq!(doc.next().unwrap().into_i64().unwrap(), 255);
assert_eq!(doc[15].clone().into_i64().unwrap(), 63); assert_eq!(doc.next().unwrap().into_i64().unwrap(), 63);
assert_eq!(doc[16][0].clone().into_i64().unwrap(), 15); assert_eq!(doc.next().unwrap().into_i64().unwrap(), 12345);
assert_eq!(doc[16][1].clone().into_i64().unwrap(), 15);
assert_eq!(doc[17].clone().into_i64().unwrap(), 12345);
assert!(doc[18][0].clone().into_bool().unwrap());
assert!(!doc[18][1].clone().into_bool().unwrap());
} }
} }