diff --git a/crates/dav/src/xml/mod.rs b/crates/dav/src/xml/mod.rs index 646bf1c..3449d0c 100644 --- a/crates/dav/src/xml/mod.rs +++ b/crates/dav/src/xml/mod.rs @@ -1 +1,2 @@ pub mod tag_list; +pub mod tag_name; diff --git a/crates/dav/src/xml/tag_name.rs b/crates/dav/src/xml/tag_name.rs new file mode 100644 index 0000000..4a122df --- /dev/null +++ b/crates/dav/src/xml/tag_name.rs @@ -0,0 +1,44 @@ +use serde::{ + de::{VariantAccess, Visitor}, + Deserialize, +}; + +#[derive(Debug, Clone)] +pub struct TagName(String); + +impl From for String { + fn from(value: TagName) -> Self { + value.0 + } +} + +impl From for TagName { + fn from(value: String) -> Self { + Self(value) + } +} + +impl<'de> Deserialize<'de> for TagName { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + struct __Visitor; + + impl<'de> Visitor<'de> for __Visitor { + type Value = TagName; + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("tagname") + } + fn visit_enum(self, data: A) -> Result + where + A: serde::de::EnumAccess<'de>, + { + let (name, variant): (String, _) = data.variant()?; + VariantAccess::unit_variant(variant)?; + Ok(TagName(name)) + } + } + deserializer.deserialize_enum("doesn't matter", &[], __Visitor) + } +}