1use alloc::{string::String, vec::Vec};
2use core::fmt;
3
4use serde::de::{Deserializer, Error, Unexpected, Visitor};
5
6use crate::SmolStr;
7
8fn smol_str<'de: 'a, 'a, D>(deserializer: D) -> Result<SmolStr, D::Error>
10where
11 D: Deserializer<'de>,
12{
13 struct SmolStrVisitor;
14
15 impl<'a> Visitor<'a> for SmolStrVisitor {
16 type Value = SmolStr;
17
18 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
19 formatter.write_str("a string")
20 }
21
22 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
23 where
24 E: Error,
25 {
26 Ok(SmolStr::from(v))
27 }
28
29 fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>
30 where
31 E: Error,
32 {
33 Ok(SmolStr::from(v))
34 }
35
36 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
37 where
38 E: Error,
39 {
40 Ok(SmolStr::from(v))
41 }
42
43 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
44 where
45 E: Error,
46 {
47 match core::str::from_utf8(v) {
48 Ok(s) => Ok(SmolStr::from(s)),
49 Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)),
50 }
51 }
52
53 fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>
54 where
55 E: Error,
56 {
57 match core::str::from_utf8(v) {
58 Ok(s) => Ok(SmolStr::from(s)),
59 Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)),
60 }
61 }
62
63 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
64 where
65 E: Error,
66 {
67 match String::from_utf8(v) {
68 Ok(s) => Ok(SmolStr::from(s)),
69 Err(e) => Err(Error::invalid_value(
70 Unexpected::Bytes(&e.into_bytes()),
71 &self,
72 )),
73 }
74 }
75 }
76
77 deserializer.deserialize_str(SmolStrVisitor)
78}
79
80impl serde::Serialize for SmolStr {
81 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
82 where
83 S: serde::Serializer,
84 {
85 self.as_str().serialize(serializer)
86 }
87}
88
89impl<'de> serde::Deserialize<'de> for SmolStr {
90 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
91 where
92 D: serde::Deserializer<'de>,
93 {
94 smol_str(deserializer)
95 }
96}