Skip to main content

non_empty_slice/
serde.rs

1#[cfg(not(feature = "serde"))]
2compile_error!("expected `serde` to be enabled");
3
4use serde::{Serialize, Serializer};
5
6use crate::slice::NonEmptySlice;
7
8impl<T: Serialize> Serialize for NonEmptySlice<T> {
9    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
10        self.as_slice().serialize(serializer)
11    }
12}
13
14#[cfg(any(feature = "std", feature = "alloc"))]
15mod std_or_alloc {
16    cfg_select! {
17        feature = "std" => {}
18        feature = "alloc" => {
19            use alloc::vec::Vec;
20        }
21        _ => {
22            compile_error!("expected either `std` or `alloc` to be enabled");
23        }
24    }
25
26    use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error};
27
28    use crate::{boxed::NonEmptyBoxedSlice, vec::NonEmptyVec};
29
30    impl<T: Serialize> Serialize for NonEmptyVec<T> {
31        fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
32            self.as_vec().serialize(serializer)
33        }
34    }
35
36    impl<'de, T: Deserialize<'de>> Deserialize<'de> for NonEmptyVec<T> {
37        fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
38            let maybe_empty = Vec::deserialize(deserializer)?;
39
40            Self::new(maybe_empty).map_err(D::Error::custom)
41        }
42    }
43
44    // NOTE: `Serialize` is implemented for `Box<U>`, provided `U: Serialize`
45    // `NonEmptySlice<T>` is `Serialize`, therefore `NonEmptyBoxedSlice<T>` is as well
46
47    impl<'de, T: Deserialize<'de>> Deserialize<'de> for NonEmptyBoxedSlice<T> {
48        fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
49            let non_empty_vec = NonEmptyVec::deserialize(deserializer)?;
50
51            Ok(non_empty_vec.into_non_empty_boxed_slice())
52        }
53    }
54}