use std::borrow::Cow; use serde::{Deserialize, Deserializer}; #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] pub struct IdUnchecked>(pub S); impl<'de> Deserialize<'de> for IdUnchecked> { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = IdUnchecked>; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { write!(formatter, "a valid ID") } fn visit_str(self, v: &str) -> Result where E: serde::de::Error, { Ok(IdUnchecked(Cow::Owned(v.to_owned()))) } fn visit_string(self, v: String) -> Result where E: serde::de::Error, { Ok(IdUnchecked(Cow::Owned(v))) } fn visit_borrowed_str(self, v: &'de str) -> Result where E: serde::de::Error, { Ok(IdUnchecked(Cow::Borrowed(v))) } } deserializer.deserialize_any(Visitor) } } impl<'de> Deserialize<'de> for IdUnchecked { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { Ok(IdUnchecked(String::deserialize(deserializer)?)) } } impl<'de> Deserialize<'de> for IdUnchecked<&'de str> { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { Ok(IdUnchecked(<&'de str>::deserialize(deserializer)?)) } }