From 2394692004b3dc3401a678158c39ab8b55815df5 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Thu, 20 Jun 2024 19:34:01 +0200 Subject: [PATCH] xml: Add tag_name --- crates/dav/src/xml/mod.rs | 1 + crates/dav/src/xml/tag_name.rs | 44 ++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 crates/dav/src/xml/tag_name.rs 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) + } +}