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}