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}