1#[cfg(not(feature = "serde"))]
2compile_error!("expected `serde` to be enabled");
3
4use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error};
5
6use crate::str::NonEmptyStr;
7
8impl Serialize for NonEmptyStr {
9 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10 self.as_str().serialize(serializer)
11 }
12}
13
14fn deserialize<'de, T: Deserialize<'de>, D: Deserializer<'de>>(
15 deserializer: D,
16) -> Result<T, D::Error> {
17 T::deserialize(deserializer)
18}
19
20impl<'de: 's, 's> Deserialize<'de> for &'s NonEmptyStr {
21 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
22 let string: &'s str = deserialize(deserializer)?;
23
24 let non_empty = string.try_into().map_err(D::Error::custom)?;
25
26 Ok(non_empty)
27 }
28}
29
30#[cfg(any(feature = "std", feature = "alloc"))]
31mod std_or_alloc {
32 cfg_select! {
33 feature = "std" => {}
34 feature = "alloc" => {
35 use alloc::string::String;
36 }
37 _ => {
38 compile_error!("expected either `std` or `alloc` to be enabled");
39 }
40 }
41
42 use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error};
43
44 use crate::{boxed::NonEmptyBoxedStr, string::NonEmptyString};
45
46 impl Serialize for NonEmptyString {
47 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
48 self.as_string().serialize(serializer)
49 }
50 }
51
52 impl<'de> Deserialize<'de> for NonEmptyString {
53 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
54 let string = String::deserialize(deserializer)?;
55
56 Self::new(string).map_err(D::Error::custom)
57 }
58 }
59
60 impl<'de> Deserialize<'de> for NonEmptyBoxedStr {
64 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
65 let non_empty_string = NonEmptyString::deserialize(deserializer)?;
66
67 Ok(non_empty_string.into_non_empty_boxed_str())
68 }
69 }
70}