vitaminc_protected/exportable/
safe_deserialize.rs1use 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
10impl<'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);