Improve my XML parser
This commit is contained in:
parent
f50f6d68aa
commit
6d1f538091
2 changed files with 51 additions and 3 deletions
|
@ -393,7 +393,9 @@ impl QRead<CompInner> for CompInner {
|
|||
impl QRead<CompSupport> for CompSupport {
|
||||
async fn qread(xml: &mut Reader<impl IRead>) -> Result<Self, ParsingError> {
|
||||
xml.open(CAL_URN, "comp").await?;
|
||||
println!("before");
|
||||
let inner = Component::new(xml.prev_attr("name").ok_or(ParsingError::MissingAttribute)?);
|
||||
println!("after");
|
||||
xml.close().await?;
|
||||
Ok(Self(inner))
|
||||
}
|
||||
|
@ -763,4 +765,42 @@ mod tests {
|
|||
let got = deserialize::<MkCalendar<Calendar>>(src).await;
|
||||
assert_eq!(got, expected)
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn rfc_mkcalendar() {
|
||||
let expected = MkCalendar(dav::Set(dav::PropValue(vec![
|
||||
dav::Property::DisplayName("Lisa's Events".into()),
|
||||
dav::Property::Extension(Property::CalendarDescription {
|
||||
lang: Some("en".into()),
|
||||
text: "Calendar restricted to events.".into(),
|
||||
}),
|
||||
dav::Property::Extension(Property::SupportedCalendarComponentSet(vec![
|
||||
CompSupport(Component::VEvent)
|
||||
])),
|
||||
dav::Property::Extension(Property::CalendarTimezone("BEGIN:VCALENDAR\nPRODID:-//Example Corp.//CalDAV Client//EN\nVERSION:2.0\nEND:VCALENDAR".into())),
|
||||
])));
|
||||
|
||||
let src = r#"
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<C:mkcalendar xmlns:D="DAV:"
|
||||
xmlns:C="urn:ietf:params:xml:ns:caldav">
|
||||
<D:set>
|
||||
<D:prop>
|
||||
<D:displayname>Lisa's Events</D:displayname>
|
||||
<C:calendar-description xml:lang="en"
|
||||
>Calendar restricted to events.</C:calendar-description>
|
||||
<C:supported-calendar-component-set>
|
||||
<C:comp name="VEVENT"/>
|
||||
</C:supported-calendar-component-set>
|
||||
<C:calendar-timezone><![CDATA[BEGIN:VCALENDAR
|
||||
PRODID:-//Example Corp.//CalDAV Client//EN
|
||||
VERSION:2.0
|
||||
END:VCALENDAR]]></C:calendar-timezone>
|
||||
</D:prop>
|
||||
</D:set>
|
||||
</C:mkcalendar>"#;
|
||||
|
||||
let got = deserialize::<MkCalendar<Calendar>>(src).await;
|
||||
assert_eq!(got, expected)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -236,12 +236,20 @@ impl<T: IRead> Reader<T> {
|
|||
pub async fn open(&mut self, ns: &[u8], key: &str) -> Result<Event<'static>, ParsingError> {
|
||||
//println!("try open tag {:?}", key);
|
||||
let evt = match self.peek() {
|
||||
Event::Empty(_) if self.is_tag(ns, key) => self.cur.clone(),
|
||||
Event::Empty(_) if self.is_tag(ns, key) => {
|
||||
// hack to make `prev_attr` works
|
||||
// here we duplicate the current tag
|
||||
// as in other words, we virtually moved one token
|
||||
// which is useful for prev_attr and any logic based on
|
||||
// self.prev + self.open() on empty nodes
|
||||
self.prev = self.cur.clone();
|
||||
self.cur.clone()
|
||||
},
|
||||
Event::Start(_) if self.is_tag(ns, key) => self.next().await?,
|
||||
_ => return Err(ParsingError::Recoverable),
|
||||
};
|
||||
|
||||
//println!("open tag {:?}", evt);
|
||||
println!("open tag {:?}", evt);
|
||||
self.parents.push(evt.clone());
|
||||
Ok(evt)
|
||||
}
|
||||
|
@ -266,7 +274,7 @@ impl<T: IRead> Reader<T> {
|
|||
|
||||
// find stop tag
|
||||
pub async fn close(&mut self) -> Result<Event<'static>, ParsingError> {
|
||||
//println!("close tag {:?}", self.parents.last());
|
||||
println!("close tag {:?}", self.parents.last());
|
||||
|
||||
// Handle the empty case
|
||||
if !self.parent_has_child() {
|
||||
|
|
Loading…
Reference in a new issue