tamer: ir::xir::reader: Parsing of child nodes
This is quick-and-dirty; refactoring can be done later on. This is also intended to demonstrate the ease with which additional events can be added---the hard work is done.main
parent
4c4d89f84f
commit
e18aeeffac
|
@ -111,6 +111,27 @@ impl<B: BufRead> XmlXirReader<B> {
|
|||
))
|
||||
}
|
||||
|
||||
QuickXmlEvent::Start(ele) => {
|
||||
Some(ele.name().try_into().map_err(Error::from).and_then(
|
||||
|qname| {
|
||||
Self::parse_attrs(
|
||||
&mut self.tokbuf,
|
||||
ele.attributes(),
|
||||
)?;
|
||||
|
||||
// The first token will be immediately returned
|
||||
// via the Iterator.
|
||||
Ok(Token::Open(qname, DUMMY_SPAN))
|
||||
},
|
||||
))
|
||||
}
|
||||
|
||||
QuickXmlEvent::End(ele) => {
|
||||
Some(ele.name().try_into().map_err(Error::from).and_then(
|
||||
|qname| Ok(Token::Close(Some(qname), DUMMY_SPAN)),
|
||||
))
|
||||
}
|
||||
|
||||
// quick_xml emits a useless text event if the first byte is
|
||||
// a '<'.
|
||||
QuickXmlEvent::Text(bytes) if bytes.escaped().is_empty() => {
|
||||
|
|
|
@ -172,6 +172,61 @@ fn permits_duplicate_attrs() {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn child_node_self_closing() {
|
||||
let sut = Sut::new(r#"<root><child /></root>"#.as_bytes());
|
||||
|
||||
let result = sut.collect::<Result<Vec<_>>>();
|
||||
|
||||
assert_eq!(
|
||||
result.expect("parsing failed"),
|
||||
vec![
|
||||
Token::Open("root".unwrap_into(), DUMMY_SPAN),
|
||||
Token::Open("child".unwrap_into(), DUMMY_SPAN),
|
||||
Token::Close(None, DUMMY_SPAN),
|
||||
Token::Close(Some("root".unwrap_into()), DUMMY_SPAN),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sibling_nodes() {
|
||||
let sut = Sut::new(r#"<root><child /><child /></root>"#.as_bytes());
|
||||
|
||||
let result = sut.collect::<Result<Vec<_>>>();
|
||||
|
||||
assert_eq!(
|
||||
result.expect("parsing failed"),
|
||||
vec![
|
||||
Token::Open("root".unwrap_into(), DUMMY_SPAN),
|
||||
Token::Open("child".unwrap_into(), DUMMY_SPAN),
|
||||
Token::Close(None, DUMMY_SPAN),
|
||||
Token::Open("child".unwrap_into(), DUMMY_SPAN),
|
||||
Token::Close(None, DUMMY_SPAN),
|
||||
Token::Close(Some("root".unwrap_into()), DUMMY_SPAN),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn child_node_with_attrs() {
|
||||
let sut = Sut::new(r#"<root><child foo="bar" /></root>"#.as_bytes());
|
||||
|
||||
let result = sut.collect::<Result<Vec<_>>>();
|
||||
|
||||
assert_eq!(
|
||||
result.expect("parsing failed"),
|
||||
vec![
|
||||
Token::Open("root".unwrap_into(), DUMMY_SPAN),
|
||||
Token::Open("child".unwrap_into(), DUMMY_SPAN),
|
||||
Token::AttrName("foo".unwrap_into(), DUMMY_SPAN),
|
||||
Token::AttrValue(AttrValue::Escaped("bar".into()), DUMMY_SPAN),
|
||||
Token::Close(None, DUMMY_SPAN),
|
||||
Token::Close(Some("root".unwrap_into()), DUMMY_SPAN),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// TODO: Enough information for error recovery and reporting.
|
||||
#[test]
|
||||
fn node_name_invalid_utf8() {
|
||||
|
|
Loading…
Reference in New Issue