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