Skip to main content

java_mapping_serde/de/
impl.rs

1use crate::{Deserialize, Deserializer};
2
3impl<'de> Deserialize<'de> for () {
4    const IS_CONDITIONAL: bool = false;
5
6    #[inline]
7    fn deserialize<D>(deserializer: D) -> Result<Option<Self>, D::Error>
8    where
9        D: Deserializer<'de>,
10    {
11        drop(deserializer);
12        Ok(Some(()))
13    }
14}
15
16#[cfg(feature = "alloc")]
17impl<'de, T> Deserialize<'de> for alloc::vec::Vec<T>
18where
19    T: Deserialize<'de>,
20{
21    const IS_CONDITIONAL: bool = false;
22
23    fn deserialize<D>(mut deserializer: D) -> Result<Option<Self>, D::Error>
24    where
25        D: Deserializer<'de>,
26    {
27        use core::marker::PhantomData;
28
29        struct __TypeCheck<T>(PhantomData<T>);
30
31        impl<'de, T> __TypeCheck<T>
32        where
33            T: Deserialize<'de>,
34        {
35            const __VALID: () = assert!(
36                T::IS_CONDITIONAL,
37                "unconditional type is not supported by collections"
38            );
39        }
40
41        let _: () = __TypeCheck::<T>::__VALID;
42
43        // capactiy is unknown here, even with hints
44        let mut vec = Self::new();
45        while let Some(element) = T::deserialize(&mut deserializer)? {
46            vec.push(element);
47        }
48
49        Ok(Some(vec))
50    }
51}
52
53#[cfg(feature = "alloc")]
54impl<'de, T> Deserialize<'de> for alloc::boxed::Box<[T]>
55where
56    T: Deserialize<'de>,
57{
58    const IS_CONDITIONAL: bool = alloc::vec::Vec::<T>::IS_CONDITIONAL;
59
60    #[inline]
61    fn deserialize<D>(deserializer: D) -> Result<Option<Self>, D::Error>
62    where
63        D: Deserializer<'de>,
64    {
65        alloc::vec::Vec::deserialize(deserializer).map(|o| o.map(alloc::vec::Vec::into_boxed_slice))
66    }
67}