1use super::{DecodeBorrowed, Error};
2use crate::{formats::Format, io::IoRead};
3
4impl<'de> DecodeBorrowed<'de> for u8 {
5 type Value = Self;
6
7 fn decode_borrowed_with_format<R>(
8 format: Format,
9 reader: &mut R,
10 ) -> core::result::Result<Self::Value, Error<R::Error>>
11 where
12 R: IoRead<'de>,
13 {
14 match format {
15 Format::PositiveFixInt(v) => Ok(v),
16 Format::Uint8 => {
17 let b = reader.read_slice(1).map_err(Error::Io)?;
18 let v: [u8; 1] = b.as_bytes().try_into().map_err(|_| Error::UnexpectedEof)?;
19 Ok(v[0])
20 }
21 _ => Err(Error::UnexpectedFormat),
22 }
23 }
24}
25
26impl<'de> DecodeBorrowed<'de> for i8 {
27 type Value = Self;
28
29 fn decode_borrowed_with_format<R>(
30 format: Format,
31 reader: &mut R,
32 ) -> core::result::Result<Self::Value, Error<R::Error>>
33 where
34 R: IoRead<'de>,
35 {
36 match format {
37 Format::Int8 => {
38 let b = reader.read_slice(1).map_err(Error::Io)?;
39 let v: [u8; 1] = b.as_bytes().try_into().map_err(|_| Error::UnexpectedEof)?;
40 Ok(v[0] as i8)
41 }
42 Format::NegativeFixInt(v) => Ok(v),
43 _ => Err(Error::UnexpectedFormat),
44 }
45 }
46}
47
48macro_rules! impl_decode_int {
49 ($ty:ty,$format:path) => {
50 impl<'de> DecodeBorrowed<'de> for $ty {
51 type Value = Self;
52
53 fn decode_borrowed_with_format<R>(
54 format: Format,
55 reader: &mut R,
56 ) -> core::result::Result<Self::Value, Error<R::Error>>
57 where
58 R: IoRead<'de>,
59 {
60 match format {
61 $format => {
62 const SIZE: usize = core::mem::size_of::<$ty>();
63 let bytes = reader.read_slice(SIZE).map_err(Error::Io)?;
64 let slice = bytes.as_bytes();
65 let data: [u8; SIZE] =
66 slice.try_into().map_err(|_| Error::UnexpectedEof)?;
67 let val = <$ty>::from_be_bytes(data);
68 Ok(val)
69 }
70 _ => Err(Error::UnexpectedFormat),
71 }
72 }
73 }
74 };
75}
76
77impl_decode_int!(u16, Format::Uint16);
78impl_decode_int!(u32, Format::Uint32);
79impl_decode_int!(u64, Format::Uint64);
80impl_decode_int!(i16, Format::Int16);
81impl_decode_int!(i32, Format::Int32);
82impl_decode_int!(i64, Format::Int64);
83
84impl<'de> DecodeBorrowed<'de> for u128 {
85 type Value = Self;
86
87 fn decode_borrowed_with_format<R>(
88 format: Format,
89 reader: &mut R,
90 ) -> core::result::Result<Self::Value, Error<R::Error>>
91 where
92 R: IoRead<'de>,
93 {
94 let val = u64::decode_borrowed_with_format(format, reader)?;
95 Ok(Self::from(val))
96 }
97}
98
99impl<'de> DecodeBorrowed<'de> for i128 {
100 type Value = Self;
101
102 fn decode_borrowed_with_format<R>(
103 format: Format,
104 reader: &mut R,
105 ) -> core::result::Result<Self::Value, Error<R::Error>>
106 where
107 R: IoRead<'de>,
108 {
109 let val = i64::decode_borrowed_with_format(format, reader)?;
110 Ok(Self::from(val))
111 }
112}
113
114impl<'de> DecodeBorrowed<'de> for usize {
115 type Value = Self;
116
117 fn decode_borrowed_with_format<R>(
118 format: Format,
119 reader: &mut R,
120 ) -> core::result::Result<Self::Value, Error<R::Error>>
121 where
122 R: IoRead<'de>,
123 {
124 let val = u64::decode_borrowed_with_format(format, reader)?;
125 usize::try_from(val).map_err(|_| Error::InvalidData)
126 }
127}
128
129impl<'de> DecodeBorrowed<'de> for isize {
130 type Value = Self;
131
132 fn decode_borrowed_with_format<R>(
133 format: Format,
134 reader: &mut R,
135 ) -> core::result::Result<Self::Value, Error<R::Error>>
136 where
137 R: IoRead<'de>,
138 {
139 let val = i64::decode_borrowed_with_format(format, reader)?;
140 isize::try_from(val).map_err(|_| Error::InvalidData)
141 }
142}
143
144#[cfg(test)]
145mod tests {
146 use crate::decode::Decode;
147
148 #[test]
149 fn decode_u8_fix_pos_int() {
150 let buf: &[u8] = &[0x00];
152 let mut r = crate::io::SliceReader::new(buf);
153 let decoded = u8::decode(&mut r).unwrap();
154 let expect = u8::MIN;
155 assert_eq!(decoded, expect);
156 assert_eq!(r.rest().len(), 0);
157
158 let buf: &[u8] = &[0x7f];
159 let mut r = crate::io::SliceReader::new(buf);
160 let decoded = u8::decode(&mut r).unwrap();
161 let expect = 0x7f;
162 assert_eq!(decoded, expect);
163 assert_eq!(r.rest().len(), 0);
164 }
165
166 #[test]
167 fn decode_u8() {
168 let buf: &[u8] = &[0xcc, 0x00];
170 let mut r = crate::io::SliceReader::new(buf);
171 let decoded = u8::decode(&mut r).unwrap();
172 let expect = u8::MIN;
173 assert_eq!(decoded, expect);
174 assert_eq!(r.rest().len(), 0);
175
176 let buf: &[u8] = &[0xcc, 0xff];
177 let mut r = crate::io::SliceReader::new(buf);
178 let decoded = u8::decode(&mut r).unwrap();
179 let expect = u8::MAX;
180 assert_eq!(decoded, expect);
181 assert_eq!(r.rest().len(), 0);
182 }
183
184 #[test]
185 fn decode_u16() {
186 let buf: &[u8] = &[0xcd, 0x00, 0x00];
188 let mut r = crate::io::SliceReader::new(buf);
189 let decoded = u16::decode(&mut r).unwrap();
190 let expect = u16::MIN;
191 assert_eq!(decoded, expect);
192 assert_eq!(r.rest().len(), 0);
193
194 let buf: &[u8] = &[0xcd, 0x12, 0x34];
195 let mut r = crate::io::SliceReader::new(buf);
196 let decoded = u16::decode(&mut r).unwrap();
197 let expect = 0x1234;
198 assert_eq!(decoded, expect);
199 assert_eq!(r.rest().len(), 0);
200
201 let buf: &[u8] = &[0xcd, 0xff, 0xff];
202 let mut r = crate::io::SliceReader::new(buf);
203 let decoded = u16::decode(&mut r).unwrap();
204 let expect = u16::MAX;
205 assert_eq!(decoded, expect);
206 assert_eq!(r.rest().len(), 0);
207 }
208
209 #[test]
210 fn decode_u32() {
211 let buf: &[u8] = &[0xce, 0x00, 0x00, 0x00, 0x00];
213 let mut r = crate::io::SliceReader::new(buf);
214 let decoded = u32::decode(&mut r).unwrap();
215 let expect = u32::MIN;
216 assert_eq!(decoded, expect);
217 assert_eq!(r.rest().len(), 0);
218
219 let buf: &[u8] = &[0xce, 0x12, 0x34, 0x56, 0x78];
220 let mut r = crate::io::SliceReader::new(buf);
221 let decoded = u32::decode(&mut r).unwrap();
222 let expect = 0x12345678;
223 assert_eq!(decoded, expect);
224 assert_eq!(r.rest().len(), 0);
225
226 let buf: &[u8] = &[0xce, 0xff, 0xff, 0xff, 0xff];
227 let mut r = crate::io::SliceReader::new(buf);
228 let decoded = u32::decode(&mut r).unwrap();
229 let expect = u32::MAX;
230 assert_eq!(decoded, expect);
231 assert_eq!(r.rest().len(), 0);
232 }
233
234 #[test]
235 fn decode_u64() {
236 let buf: &[u8] = &[0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
238 let mut r = crate::io::SliceReader::new(buf);
239 let decoded = u64::decode(&mut r).unwrap();
240 let expect = u64::MIN;
241 assert_eq!(decoded, expect);
242 assert_eq!(r.rest().len(), 0);
243
244 let buf: &[u8] = &[0xcf, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78];
245 let mut r = crate::io::SliceReader::new(buf);
246 let decoded = u64::decode(&mut r).unwrap();
247 let expect = 0x1234567812345678;
248 assert_eq!(decoded, expect);
249 assert_eq!(r.rest().len(), 0);
250
251 let buf: &[u8] = &[0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff];
252 let mut r = crate::io::SliceReader::new(buf);
253 let decoded = u64::decode(&mut r).unwrap();
254 let expect = u64::MAX;
255 assert_eq!(decoded, expect);
256 assert_eq!(r.rest().len(), 0);
257 }
258
259 #[test]
260 fn decode_i8_fix_neg_int() {
261 let buf: &[u8] = &[0xff];
263 let mut r = crate::io::SliceReader::new(buf);
264 let decoded = i8::decode(&mut r).unwrap();
265 let expect = -1;
266 assert_eq!(decoded, expect);
267 assert_eq!(r.rest().len(), 0);
268
269 let buf: &[u8] = &[0xe0];
270 let mut r = crate::io::SliceReader::new(buf);
271 let decoded = i8::decode(&mut r).unwrap();
272 let expect = -32;
273 assert_eq!(decoded, expect);
274 assert_eq!(r.rest().len(), 0);
275 }
276
277 #[test]
278 fn decode_i8() {
279 let buf: &[u8] = &[0xd0, 0x80];
281 let mut r = crate::io::SliceReader::new(buf);
282 let decoded = i8::decode(&mut r).unwrap();
283 let expect = i8::MIN;
284 assert_eq!(decoded, expect);
285 assert_eq!(r.rest().len(), 0);
286
287 let buf: &[u8] = &[0xd0, 0x7f];
288 let mut r = crate::io::SliceReader::new(buf);
289 let decoded = i8::decode(&mut r).unwrap();
290 let expect = i8::MAX;
291 assert_eq!(decoded, expect);
292 assert_eq!(r.rest().len(), 0);
293 }
294
295 #[test]
296 fn decode_i16() {
297 let buf: &[u8] = &[0xd1, 0x80, 0x00];
299 let mut r = crate::io::SliceReader::new(buf);
300 let decoded = i16::decode(&mut r).unwrap();
301 let expect = i16::MIN;
302 assert_eq!(decoded, expect);
303 assert_eq!(r.rest().len(), 0);
304
305 let buf: &[u8] = &[0xd1, 0x7f, 0xff];
306 let mut r = crate::io::SliceReader::new(buf);
307 let decoded = i16::decode(&mut r).unwrap();
308 let expect = i16::MAX;
309 assert_eq!(decoded, expect);
310 assert_eq!(r.rest().len(), 0);
311 }
312
313 #[test]
314 fn decode_i32() {
315 let buf: &[u8] = &[0xd2, 0x80, 0x00, 0x00, 0x00];
317 let mut r = crate::io::SliceReader::new(buf);
318 let decoded = i32::decode(&mut r).unwrap();
319 let expect = i32::MIN;
320 assert_eq!(decoded, expect);
321 assert_eq!(r.rest().len(), 0);
322
323 let buf: &[u8] = &[0xd2, 0x7f, 0xff, 0xff, 0xff];
324 let mut r = crate::io::SliceReader::new(buf);
325 let decoded = i32::decode(&mut r).unwrap();
326 let expect = i32::MAX;
327 assert_eq!(decoded, expect);
328 assert_eq!(r.rest().len(), 0);
329 }
330
331 #[test]
332 fn decode_i64() {
333 let buf: &[u8] = &[0xd3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
335 let mut r = crate::io::SliceReader::new(buf);
336 let decoded = i64::decode(&mut r).unwrap();
337 let expect = i64::MIN;
338 assert_eq!(decoded, expect);
339 assert_eq!(r.rest().len(), 0);
340
341 let buf: &[u8] = &[0xd3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff];
342 let mut r = crate::io::SliceReader::new(buf);
343 let decoded = i64::decode(&mut r).unwrap();
344 let expect = i64::MAX;
345 assert_eq!(decoded, expect);
346 assert_eq!(r.rest().len(), 0);
347 }
348}