rama_utils/str/arcstr/
impl_serde.rs1use 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}