use std::{borrow::Cow, str}; use serde::de::{self, Deserialize, Deserializer, Unexpected, Visitor}; pub(crate) struct MyCowStr<'a>(Cow<'a, str>); impl<'a> MyCowStr<'a> { pub(crate) fn get(self) -> Cow<'a, str> { self.0 } } impl<'de> Deserialize<'de> for MyCowStr<'de> { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { deserialize_cow_str(deserializer).map(Self) } } /// Deserialize a `Cow<'de, str>`. /// /// Different from serde's implementation of `Deserialize` for `Cow` since it borrows from the /// input when possible. /// /// This will become unnecessary if Rust gains lifetime specialization at some point; see /// . pub fn deserialize_cow_str<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { deserializer.deserialize_string(CowStrVisitor) } struct CowStrVisitor; impl<'de> Visitor<'de> for CowStrVisitor { type Value = Cow<'de, str>; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { formatter.write_str("a string") } fn visit_borrowed_str(self, v: &'de str) -> Result where E: de::Error, { Ok(Cow::Borrowed(v)) } fn visit_borrowed_bytes(self, v: &'de [u8]) -> Result where E: de::Error, { match str::from_utf8(v) { Ok(s) => Ok(Cow::Borrowed(s)), Err(_) => Err(de::Error::invalid_value(Unexpected::Bytes(v), &self)), } } fn visit_str(self, v: &str) -> Result where E: de::Error, { Ok(Cow::Owned(v.to_owned())) } fn visit_string(self, v: String) -> Result where E: de::Error, { Ok(Cow::Owned(v)) } fn visit_bytes(self, v: &[u8]) -> Result where E: de::Error, { match str::from_utf8(v) { Ok(s) => Ok(Cow::Owned(s.to_owned())), Err(_) => Err(de::Error::invalid_value(Unexpected::Bytes(v), &self)), } } fn visit_byte_buf(self, v: Vec) -> Result where E: de::Error, { match String::from_utf8(v) { Ok(s) => Ok(Cow::Owned(s)), Err(e) => Err(de::Error::invalid_value(Unexpected::Bytes(&e.into_bytes()), &self)), } } }