vitaminc_protected/exportable/
safe_deserialize.rs

1use crate::Controlled;
2use serde::{Deserialize, Deserializer};
3
4pub trait SafeDeserialize<'de>: Sized {
5    fn safe_deserialize<D>(deserializer: D) -> Result<Self, D::Error>
6    where
7        D: Deserializer<'de>;
8}
9
10/// Blanket implementation for all controlled types who's inner type implements `SafeSerialize`.
11impl<'de, T> SafeDeserialize<'de> for T
12where
13    T::Inner: SafeDeserialize<'de>,
14    T: Controlled,
15{
16    fn safe_deserialize<S>(deserializer: S) -> Result<Self, S::Error>
17    where
18        S: Deserializer<'de>,
19    {
20        T::Inner::safe_deserialize(deserializer).map(T::init_from_inner)
21    }
22}
23
24impl<'de, const N: usize> SafeDeserialize<'de> for [u8; N] {
25    fn safe_deserialize<D>(deserializer: D) -> Result<Self, D::Error>
26    where
27        D: Deserializer<'de>,
28    {
29        serde_bytes::ByteArray::deserialize(deserializer).map(|bytes| bytes.into_array())
30    }
31}
32
33macro_rules! impl_safe_deserialize {
34    ($($type:ty),+) => {
35        $(
36            impl<'de> SafeDeserialize<'de> for $type {
37                #[inline]
38                fn safe_deserialize<D>(deserializer: D) -> Result<Self, D::Error>
39                where
40                    D: Deserializer<'de>,
41                {
42                    serde::Deserialize::deserialize(deserializer)
43                }
44            }
45        )+
46    };
47}
48
49impl_safe_deserialize!(
50    i8, i16, i32, i64, i128, u8, u16, u32, u64, u128, f32, f64, bool, char, String
51);