|
| 1 | +use crate::{ |
| 2 | + helpers::{take_byte_iter, take_num_iter}, |
| 3 | + Unpackable, |
| 4 | +}; |
| 5 | + |
1 | 6 | use super::{
|
2 | 7 | helpers::{take_byte, take_num},
|
3 |
| - Error, Format, Unpackable, |
| 8 | + Error, Format, |
4 | 9 | };
|
| 10 | +use alloc::{string::String, vec::Vec}; |
5 | 11 | use core::str;
|
6 | 12 |
|
7 | 13 | pub fn unpack_bytes(mut buf: &[u8]) -> Result<(usize, &[u8]), Error> {
|
@@ -34,77 +40,70 @@ pub fn unpack_str(mut buf: &[u8]) -> Result<(usize, &str), Error> {
|
34 | 40 | Ok((n + len, str))
|
35 | 41 | }
|
36 | 42 |
|
37 |
| -#[cfg(feature = "alloc")] |
38 |
| -mod alloc { |
39 |
| - use super::*; |
40 |
| - use crate::helpers::{take_byte_iter, take_num_iter}; |
41 |
| - use ::alloc::{string::String, vec::Vec}; |
| 43 | +impl Unpackable for Vec<u8> { |
| 44 | + type Error = Error; |
42 | 45 |
|
43 |
| - impl Unpackable for Vec<u8> { |
44 |
| - type Error = Error; |
45 |
| - |
46 |
| - fn unpack(buf: &[u8]) -> Result<(usize, Self), Self::Error> { |
47 |
| - unpack_bytes(buf).map(|(n, b)| (n, b.to_vec())) |
48 |
| - } |
| 46 | + fn unpack(buf: &[u8]) -> Result<(usize, Self), Self::Error> { |
| 47 | + unpack_bytes(buf).map(|(n, b)| (n, b.to_vec())) |
| 48 | + } |
49 | 49 |
|
50 |
| - fn unpack_iter<I>(bytes: I) -> Result<(usize, Self), Self::Error> |
51 |
| - where |
52 |
| - I: IntoIterator<Item = u8>, |
53 |
| - { |
54 |
| - let mut bytes = bytes.into_iter(); |
55 |
| - let format = take_byte_iter(bytes.by_ref())?; |
56 |
| - let (n, len) = match format { |
57 |
| - Format::BIN8 => (2, take_byte_iter(bytes.by_ref())? as usize), |
58 |
| - Format::BIN16 => ( |
59 |
| - 3, |
60 |
| - take_num_iter(bytes.by_ref(), u16::from_be_bytes)? as usize, |
61 |
| - ), |
62 |
| - Format::BIN32 => ( |
63 |
| - 5, |
64 |
| - take_num_iter(bytes.by_ref(), u32::from_be_bytes)? as usize, |
65 |
| - ), |
66 |
| - _ => return Err(Error::UnexpectedFormatTag), |
67 |
| - }; |
68 |
| - let v: Vec<_> = bytes.take(len).collect(); |
69 |
| - if v.len() < len { |
70 |
| - return Err(Error::BufferTooShort); |
71 |
| - } |
72 |
| - Ok((n + len, v)) |
| 50 | + fn unpack_iter<I>(bytes: I) -> Result<(usize, Self), Self::Error> |
| 51 | + where |
| 52 | + I: IntoIterator<Item = u8>, |
| 53 | + { |
| 54 | + let mut bytes = bytes.into_iter(); |
| 55 | + let format = take_byte_iter(bytes.by_ref())?; |
| 56 | + let (n, len) = match format { |
| 57 | + Format::BIN8 => (2, take_byte_iter(bytes.by_ref())? as usize), |
| 58 | + Format::BIN16 => ( |
| 59 | + 3, |
| 60 | + take_num_iter(bytes.by_ref(), u16::from_be_bytes)? as usize, |
| 61 | + ), |
| 62 | + Format::BIN32 => ( |
| 63 | + 5, |
| 64 | + take_num_iter(bytes.by_ref(), u32::from_be_bytes)? as usize, |
| 65 | + ), |
| 66 | + _ => return Err(Error::UnexpectedFormatTag), |
| 67 | + }; |
| 68 | + let v: Vec<_> = bytes.take(len).collect(); |
| 69 | + if v.len() < len { |
| 70 | + return Err(Error::BufferTooShort); |
73 | 71 | }
|
| 72 | + Ok((n + len, v)) |
74 | 73 | }
|
| 74 | +} |
75 | 75 |
|
76 |
| - impl Unpackable for String { |
77 |
| - type Error = Error; |
| 76 | +impl Unpackable for String { |
| 77 | + type Error = Error; |
78 | 78 |
|
79 |
| - fn unpack(buf: &[u8]) -> Result<(usize, Self), Self::Error> { |
80 |
| - unpack_str(buf).map(|(n, s)| (n, s.into())) |
81 |
| - } |
| 79 | + fn unpack(buf: &[u8]) -> Result<(usize, Self), Self::Error> { |
| 80 | + unpack_str(buf).map(|(n, s)| (n, s.into())) |
| 81 | + } |
82 | 82 |
|
83 |
| - fn unpack_iter<I>(bytes: I) -> Result<(usize, Self), Self::Error> |
84 |
| - where |
85 |
| - I: IntoIterator<Item = u8>, |
86 |
| - { |
87 |
| - let mut bytes = bytes.into_iter(); |
88 |
| - let format = take_byte_iter(bytes.by_ref())?; |
89 |
| - let (n, len) = match format { |
90 |
| - 0xa0..=0xbf => (1, format as usize & 0x1f), |
91 |
| - Format::STR8 => (2, take_byte_iter(bytes.by_ref())? as usize), |
92 |
| - Format::STR16 => ( |
93 |
| - 3, |
94 |
| - take_num_iter(bytes.by_ref(), u16::from_be_bytes)? as usize, |
95 |
| - ), |
96 |
| - Format::STR32 => ( |
97 |
| - 5, |
98 |
| - take_num_iter(bytes.by_ref(), u32::from_be_bytes)? as usize, |
99 |
| - ), |
100 |
| - _ => return Err(Error::UnexpectedFormatTag), |
101 |
| - }; |
102 |
| - let v: Vec<_> = bytes.take(len).collect(); |
103 |
| - if v.len() < len { |
104 |
| - return Err(Error::BufferTooShort); |
105 |
| - } |
106 |
| - let s = String::from_utf8(v).map_err(|_| Error::InvalidUtf8)?; |
107 |
| - Ok((n + len, s)) |
| 83 | + fn unpack_iter<I>(bytes: I) -> Result<(usize, Self), Self::Error> |
| 84 | + where |
| 85 | + I: IntoIterator<Item = u8>, |
| 86 | + { |
| 87 | + let mut bytes = bytes.into_iter(); |
| 88 | + let format = take_byte_iter(bytes.by_ref())?; |
| 89 | + let (n, len) = match format { |
| 90 | + 0xa0..=0xbf => (1, format as usize & 0x1f), |
| 91 | + Format::STR8 => (2, take_byte_iter(bytes.by_ref())? as usize), |
| 92 | + Format::STR16 => ( |
| 93 | + 3, |
| 94 | + take_num_iter(bytes.by_ref(), u16::from_be_bytes)? as usize, |
| 95 | + ), |
| 96 | + Format::STR32 => ( |
| 97 | + 5, |
| 98 | + take_num_iter(bytes.by_ref(), u32::from_be_bytes)? as usize, |
| 99 | + ), |
| 100 | + _ => return Err(Error::UnexpectedFormatTag), |
| 101 | + }; |
| 102 | + let v: Vec<_> = bytes.take(len).collect(); |
| 103 | + if v.len() < len { |
| 104 | + return Err(Error::BufferTooShort); |
108 | 105 | }
|
| 106 | + let s = String::from_utf8(v).map_err(|_| Error::InvalidUtf8)?; |
| 107 | + Ok((n + len, s)) |
109 | 108 | }
|
110 | 109 | }
|
0 commit comments