aboutsummaryrefslogtreecommitdiff
path: root/aero-dav
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2024-03-08 22:03:46 +0100
committerQuentin Dufour <quentin@deuxfleurs.fr>2024-03-08 22:03:46 +0100
commit6d1f538091ca9445cdc0d72b051fa5090b6ec68a (patch)
treed639d3109798dc430997186130aa638766b46eb6 /aero-dav
parentf50f6d68aa8c3bc363fb71bc75a2c1f78f14803f (diff)
downloadaerogramme-6d1f538091ca9445cdc0d72b051fa5090b6ec68a.tar.gz
aerogramme-6d1f538091ca9445cdc0d72b051fa5090b6ec68a.zip
Improve my XML parser
Diffstat (limited to 'aero-dav')
-rw-r--r--aero-dav/src/caldecoder.rs40
-rw-r--r--aero-dav/src/xml.rs14
2 files changed, 51 insertions, 3 deletions
diff --git a/aero-dav/src/caldecoder.rs b/aero-dav/src/caldecoder.rs
index 1a096c1..239b005 100644
--- a/aero-dav/src/caldecoder.rs
+++ b/aero-dav/src/caldecoder.rs
@@ -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)
+ }
}
diff --git a/aero-dav/src/xml.rs b/aero-dav/src/xml.rs
index e021543..347a123 100644
--- a/aero-dav/src/xml.rs
+++ b/aero-dav/src/xml.rs
@@ -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() {