Skip to main content

non_empty_str/
serde.rs

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    // NOTE: `Serialize` is implemented for `Box<T>`, provided `T: Serialize`
61    // `NonEmptyStr` is `Serialize`, therefore `NonEmptyBoxedStr` is as well
62
63    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}