Skip to main content

toml_spanner/
de.rs

1#[cfg(test)]
2#[path = "./de_tests.rs"]
3mod tests;
4
5use crate::{
6    Deserialize, Error, ErrorKind,
7    value::{self, Item},
8};
9
10impl<'de> Deserialize<'de> for String {
11    fn deserialize(value: &mut Item<'de>) -> Result<Self, Error> {
12        value.take_string(None).map(String::from)
13    }
14}
15
16impl<'de> Deserialize<'de> for &'de str {
17    fn deserialize(value: &mut Item<'de>) -> Result<Self, Error> {
18        value.take_string(None)
19    }
20}
21
22impl<'de> Deserialize<'de> for std::borrow::Cow<'de, str> {
23    fn deserialize(value: &mut Item<'de>) -> Result<Self, Error> {
24        value.take_string(None).map(std::borrow::Cow::from)
25    }
26}
27
28impl<'de> Deserialize<'de> for bool {
29    fn deserialize(value: &mut Item<'de>) -> Result<Self, Error> {
30        match value.as_bool() {
31            Some(b) => Ok(b),
32            None => Err(value.expected("a bool")),
33        }
34    }
35}
36
37fn deser_integer(
38    value: &mut Item<'_>,
39    min: i64,
40    max: i64,
41    name: &'static str,
42) -> Result<i64, Error> {
43    let span = value.span();
44    match value.as_i64() {
45        Some(i) if i >= min && i <= max => Ok(i),
46        Some(_) => Err(Error {
47            kind: ErrorKind::OutOfRange(name),
48            span,
49        }),
50        None => Err(value.expected("an integer")),
51    }
52}
53
54macro_rules! integer {
55    ($($num:ty),+) => {$(
56        impl<'de> Deserialize<'de> for $num {
57            fn deserialize(value: &mut Item<'de>) -> Result<Self, Error> {
58                match deser_integer(value, <$num>::MIN as i64, <$num>::MAX as i64, stringify!($num)) {
59                    Ok(i) => Ok(i as $num),
60                    Err(e) => Err(e),
61                }
62            }
63        }
64    )+};
65}
66
67integer!(i8, i16, i32, isize, u8, u16, u32);
68
69impl<'de> Deserialize<'de> for i64 {
70    fn deserialize(value: &mut Item<'de>) -> Result<Self, Error> {
71        deser_integer(value, i64::MIN, i64::MAX, "i64")
72    }
73}
74
75impl<'de> Deserialize<'de> for u64 {
76    fn deserialize(value: &mut Item<'de>) -> Result<Self, Error> {
77        match deser_integer(value, 0, i64::MAX, "u64") {
78            Ok(i) => Ok(i as u64),
79            Err(e) => Err(e),
80        }
81    }
82}
83
84impl<'de> Deserialize<'de> for usize {
85    fn deserialize(value: &mut Item<'de>) -> Result<Self, Error> {
86        const MAX: i64 = if usize::BITS < 64 {
87            usize::MAX as i64
88        } else {
89            i64::MAX
90        };
91        match deser_integer(value, 0, MAX, "usize") {
92            Ok(i) => Ok(i as usize),
93            Err(e) => Err(e),
94        }
95    }
96}
97
98impl<'de> Deserialize<'de> for f32 {
99    fn deserialize(value: &mut Item<'de>) -> Result<Self, Error> {
100        match value.as_f64() {
101            Some(f) => Ok(f as f32),
102            None => Err(value.expected("a float")),
103        }
104    }
105}
106
107impl<'de> Deserialize<'de> for f64 {
108    fn deserialize(value: &mut Item<'de>) -> Result<Self, Error> {
109        match value.as_f64() {
110            Some(f) => Ok(f),
111            None => Err(value.expected("a float")),
112        }
113    }
114}
115
116impl<'de, T> Deserialize<'de> for Vec<T>
117where
118    T: Deserialize<'de>,
119{
120    fn deserialize(value: &mut value::Item<'de>) -> Result<Self, Error> {
121        let value::ValueMut::Array(arr) = value.value_mut() else {
122            return Err(value.expected("an array"));
123        };
124        let arr = std::mem::take(arr);
125
126        let mut s = Vec::new();
127        for mut v in arr {
128            s.push(T::deserialize(&mut v)?);
129        }
130
131        Ok(s)
132    }
133}