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}