Skip to main content

rustical_dav/xml/
resourcetype.rs

1use rustical_xml::XmlSerialize;
2
3#[derive(Debug, Clone, PartialEq, Eq, XmlSerialize)]
4pub struct Resourcetype(#[xml(flatten, ty = "untagged")] pub &'static [ResourcetypeInner]);
5
6#[macro_export]
7macro_rules! resourcetype {
8    ($(($ns:expr, $name:expr)),* $(,)?) => {
9        ::rustical_dav::xml::Resourcetype(&[
10            $(::rustical_dav::xml::ResourcetypeInner(Some($ns), $name)),*
11        ])
12    };
13}
14
15pub use resourcetype;
16
17#[derive(Debug, Clone, PartialEq, Eq, XmlSerialize)]
18pub struct ResourcetypeInner(
19    #[xml(ty = "namespace")] pub Option<quick_xml::name::Namespace<'static>>,
20    #[xml(ty = "tag_name")] pub &'static str,
21);
22
23#[cfg(test)]
24mod tests {
25    use rustical_xml::{XmlRootTag, XmlSerialize, XmlSerializeRoot};
26
27    use crate::namespace::{NS_CALENDARSERVER, NS_DAV};
28
29    use super::{Resourcetype, ResourcetypeInner};
30
31    #[derive(XmlSerialize, XmlRootTag)]
32    #[xml(root = "document")]
33    struct Document {
34        resourcetype: Resourcetype,
35    }
36
37    #[test]
38    fn test_serialize_resourcetype() {
39        let out = Document {
40            resourcetype: Resourcetype(&[
41                ResourcetypeInner(Some(NS_DAV), "displayname"),
42                ResourcetypeInner(Some(NS_CALENDARSERVER), "calendar-color"),
43            ]),
44        }
45        .serialize_to_string()
46        .unwrap();
47        assert_eq!(
48            out,
49            r#"<?xml version="1.0" encoding="utf-8"?>
50<document>
51    <resourcetype>
52        <displayname xmlns="DAV:"/>
53        <calendar-color xmlns="http://calendarserver.org/ns/"/>
54    </resourcetype>
55</document>"#
56        );
57    }
58}