stroka/
serde.rs

1use serde::de::{Deserialize, Deserializer};
2use serde::ser::{Serialize, Serializer};
3
4use crate::String;
5
6impl Serialize for String {
7    fn serialize<SER: Serializer>(&self, ser: SER) -> Result<SER::Ok, SER::Error> {
8        ser.serialize_str(self.as_str())
9    }
10}
11
12struct StringVisitor;
13
14impl<'de> serde::de::Visitor<'de> for StringVisitor {
15    type Value = String;
16
17    #[inline(always)]
18    fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
19        formatter.write_str("a string")
20    }
21
22    #[inline]
23    fn visit_str<E: serde::de::Error>(self, v: &str) -> Result<Self::Value, E> {
24        Ok(String::new_str(v))
25    }
26}
27
28impl<'de> Deserialize<'de> for String {
29    #[inline]
30    fn deserialize<D: Deserializer<'de>>(des: D) -> Result<Self, D::Error> {
31        des.deserialize_str(StringVisitor)
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use crate::String;
38
39    use serde::de::Deserialize;
40    use serde::de::value::{BorrowedStrDeserializer, Error as ValueError};
41
42    #[test]
43    fn should_deserialize_within_sso_cap() {
44        let des = BorrowedStrDeserializer::<ValueError>::new("lolka");
45        let res = String::deserialize(des).expect("Unexpected fail");
46        assert_eq!(res, "lolka");
47        assert!(!res.is_alloc());
48    }
49
50    #[test]
51    fn should_deserialize_outside_sso_cap() {
52        const TEXT: &str = "lolka lol lolid by loli";
53        let des = BorrowedStrDeserializer::<ValueError>::new(TEXT);
54        let res = String::deserialize(des).expect("Unexpected fail");
55        assert_eq!(res.as_str(), TEXT);
56        assert!(res.is_alloc());
57    }
58}