Skip to main content

rama_utils/str/arcstr/
impl_serde.rs

1use super::ArcStr;
2use super::Substr;
3
4use core::marker::PhantomData;
5use serde::{Deserialize, Deserializer, Serialize, Serializer, de};
6
7impl Serialize for ArcStr {
8    fn serialize<S: Serializer>(&self, ser: S) -> Result<S::Ok, S::Error> {
9        ser.serialize_str(self)
10    }
11}
12
13impl<'de> Deserialize<'de> for ArcStr {
14    fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
15        d.deserialize_str(StrVisitor::<Self>(PhantomData))
16    }
17}
18
19impl Serialize for Substr {
20    fn serialize<S: Serializer>(&self, ser: S) -> Result<S::Ok, S::Error> {
21        ser.serialize_str(self)
22    }
23}
24
25impl<'de> Deserialize<'de> for Substr {
26    fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
27        d.deserialize_str(StrVisitor::<Self>(PhantomData))
28    }
29}
30
31struct StrVisitor<StrTy>(PhantomData<fn() -> StrTy>);
32
33impl<'de, StrTy> de::Visitor<'de> for StrVisitor<StrTy>
34where
35    for<'a> &'a str: Into<StrTy>,
36{
37    type Value = StrTy;
38    fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
39        formatter.write_str("a string")
40    }
41    fn visit_str<E: de::Error>(self, v: &str) -> Result<Self::Value, E> {
42        Ok(v.into())
43    }
44    fn visit_bytes<E: de::Error>(self, v: &[u8]) -> Result<Self::Value, E> {
45        match core::str::from_utf8(v) {
46            Ok(s) => Ok(s.into()),
47            Err(_) => Err(de::Error::invalid_value(de::Unexpected::Bytes(v), &self)),
48        }
49    }
50}