serde_smile/de/
read.rs

1use crate::Error;
2use memchr::memchr;
3use std::io::BufRead;
4use std::mem;
5use std::ops::{Deref, DerefMut};
6
7pub(crate) mod private {
8    pub trait Sealed {}
9}
10
11/// A trait used by [`Deserializer`](crate::Deserializer) to abstract over input types.
12///
13/// This trait is sealed and cannot be implemented outside of `serde_smile`. The contents of the trait are not
14/// considered part of the crate's public API and are subject to change at any time.
15pub trait Read<'de>: private::Sealed {
16    #[doc(hidden)]
17    fn next(&mut self) -> Result<Option<u8>, Error>;
18
19    #[doc(hidden)]
20    fn peek(&mut self) -> Result<Option<u8>, Error>;
21
22    #[doc(hidden)]
23    fn consume(&mut self);
24
25    #[doc(hidden)]
26    fn read<'a>(&'a mut self, n: usize) -> Result<Option<Buf<'a, 'de>>, Error>;
27
28    #[doc(hidden)]
29    fn read_mut<'a>(&'a mut self, n: usize) -> Result<Option<MutBuf<'a, 'de>>, Error>;
30
31    #[doc(hidden)]
32    fn read_until<'a>(&'a mut self, end: u8) -> Result<Option<Buf<'a, 'de>>, Error>;
33}
34
35pub enum Buf<'a, 'de> {
36    Short(&'a [u8]),
37    Long(&'de [u8]),
38}
39
40impl Deref for Buf<'_, '_> {
41    type Target = [u8];
42
43    #[inline]
44    fn deref(&self) -> &Self::Target {
45        match self {
46            Buf::Short(buf) => buf,
47            Buf::Long(buf) => buf,
48        }
49    }
50}
51
52pub enum MutBuf<'a, 'de> {
53    Short(&'a mut [u8]),
54    Long(&'de mut [u8]),
55}
56
57impl Deref for MutBuf<'_, '_> {
58    type Target = [u8];
59
60    #[inline]
61    fn deref(&self) -> &Self::Target {
62        match self {
63            MutBuf::Short(buf) => buf,
64            MutBuf::Long(buf) => buf,
65        }
66    }
67}
68
69impl DerefMut for MutBuf<'_, '_> {
70    #[inline]
71    fn deref_mut(&mut self) -> &mut Self::Target {
72        match self {
73            MutBuf::Short(buf) => buf,
74            MutBuf::Long(buf) => buf,
75        }
76    }
77}
78
79/// A [`Read`] implementation for shared slices.
80pub struct SliceRead<'a> {
81    slice: &'a [u8],
82    index: usize,
83    buf: Vec<u8>,
84}
85
86impl<'a> SliceRead<'a> {
87    /// Creates a new `SliceRead`.
88    pub fn new(slice: &'a [u8]) -> Self {
89        SliceRead {
90            slice,
91            index: 0,
92            buf: vec![],
93        }
94    }
95}
96
97impl private::Sealed for SliceRead<'_> {}
98
99impl<'de> Read<'de> for SliceRead<'de> {
100    #[inline]
101    fn next(&mut self) -> Result<Option<u8>, Error> {
102        if self.index < self.slice.len() {
103            let ch = self.slice[self.index];
104            self.index += 1;
105            Ok(Some(ch))
106        } else {
107            Ok(None)
108        }
109    }
110
111    #[inline]
112    fn peek(&mut self) -> Result<Option<u8>, Error> {
113        if self.index < self.slice.len() {
114            Ok(Some(self.slice[self.index]))
115        } else {
116            Ok(None)
117        }
118    }
119
120    #[inline]
121    fn consume(&mut self) {
122        self.index += 1;
123    }
124
125    #[inline]
126    fn read<'a>(&'a mut self, n: usize) -> Result<Option<Buf<'a, 'de>>, Error> {
127        let s = &self.slice[self.index..];
128        if n <= s.len() {
129            self.index += n;
130            Ok(Some(Buf::Long(&s[..n])))
131        } else {
132            Ok(None)
133        }
134    }
135
136    fn read_mut<'a>(&'a mut self, n: usize) -> Result<Option<MutBuf<'a, 'de>>, Error> {
137        let s = &self.slice[self.index..];
138        if n <= s.len() {
139            self.index += n;
140            self.buf.clear();
141            self.buf.extend_from_slice(&s[..n]);
142            Ok(Some(MutBuf::Short(&mut self.buf)))
143        } else {
144            Ok(None)
145        }
146    }
147
148    fn read_until<'a>(&'a mut self, end: u8) -> Result<Option<Buf<'a, 'de>>, Error> {
149        let s = &self.slice[self.index..];
150        match memchr(end, s) {
151            Some(end) => {
152                self.index += end + 1;
153                Ok(Some(Buf::Long(&s[..end])))
154            }
155            None => Ok(None),
156        }
157    }
158}
159
160/// A [`Read`] implementation for mutable slices.
161pub struct MutSliceRead<'a> {
162    slice: &'a mut [u8],
163}
164
165impl<'a> MutSliceRead<'a> {
166    /// Creates a new `MutSliceRead`.
167    pub fn new(slice: &'a mut [u8]) -> Self {
168        MutSliceRead { slice }
169    }
170}
171
172impl private::Sealed for MutSliceRead<'_> {}
173
174impl<'de> Read<'de> for MutSliceRead<'de> {
175    fn next(&mut self) -> Result<Option<u8>, Error> {
176        if !self.slice.is_empty() {
177            let slice = mem::take(&mut self.slice);
178            let b = slice[0];
179
180            self.slice = &mut slice[1..];
181            Ok(Some(b))
182        } else {
183            Ok(None)
184        }
185    }
186
187    fn peek(&mut self) -> Result<Option<u8>, Error> {
188        if !self.slice.is_empty() {
189            Ok(Some(self.slice[0]))
190        } else {
191            Ok(None)
192        }
193    }
194
195    fn consume(&mut self) {
196        let slice = mem::take(&mut self.slice);
197        self.slice = &mut slice[1..];
198    }
199
200    fn read<'a>(&'a mut self, n: usize) -> Result<Option<Buf<'a, 'de>>, Error> {
201        if n <= self.slice.len() {
202            let (a, b) = mem::take(&mut self.slice).split_at_mut(n);
203            self.slice = b;
204            Ok(Some(Buf::Long(a)))
205        } else {
206            Ok(None)
207        }
208    }
209
210    fn read_mut<'a>(&'a mut self, n: usize) -> Result<Option<MutBuf<'a, 'de>>, Error> {
211        if n <= self.slice.len() {
212            let (a, b) = mem::take(&mut self.slice).split_at_mut(n);
213            self.slice = b;
214            Ok(Some(MutBuf::Long(a)))
215        } else {
216            Ok(None)
217        }
218    }
219
220    fn read_until<'a>(&'a mut self, end: u8) -> Result<Option<Buf<'a, 'de>>, Error> {
221        match memchr(end, self.slice) {
222            Some(end) => {
223                let (a, b) = mem::take(&mut self.slice).split_at_mut(end);
224                self.slice = &mut b[1..];
225                Ok(Some(Buf::Long(a)))
226            }
227            None => Ok(None),
228        }
229    }
230}
231
232/// A [`Read`] implementation for buffered IO streams.
233pub struct IoRead<R> {
234    reader: R,
235    buf: Vec<u8>,
236}
237
238impl<R> IoRead<R>
239where
240    R: BufRead,
241{
242    /// Creates a new `IoRead`.
243    pub fn new(reader: R) -> Self {
244        IoRead {
245            reader,
246            buf: vec![],
247        }
248    }
249
250    /// Returns a shared reference to the inner reader.
251    pub fn get_ref(&self) -> &R {
252        &self.reader
253    }
254
255    /// Returns a mutable reference to the inner reader.
256    pub fn get_mut(&mut self) -> &mut R {
257        &mut self.reader
258    }
259
260    /// Consumes the `IoRead`, returning the inner reader.
261    pub fn into_inner(self) -> R {
262        self.reader
263    }
264
265    fn fill_buf(&mut self, n: usize) -> Result<bool, Error> {
266        self.buf.clear();
267        // defend against malicious input pretending to be huge by limiting growth
268        self.buf.reserve(usize::min(n, 16 * 1024));
269
270        let mut remaining = n;
271        while remaining > 0 {
272            let buf = self.reader.fill_buf().map_err(Error::io)?;
273            if buf.is_empty() {
274                return Ok(false);
275            }
276
277            let len = usize::min(remaining, buf.len());
278            self.buf.extend_from_slice(&buf[..len]);
279            self.reader.consume(len);
280            remaining -= len;
281        }
282
283        Ok(true)
284    }
285}
286
287impl<R> private::Sealed for IoRead<R> {}
288
289impl<'de, R> Read<'de> for IoRead<R>
290where
291    R: BufRead,
292{
293    fn next(&mut self) -> Result<Option<u8>, Error> {
294        let r = self.peek();
295        if let Ok(Some(_)) = r {
296            self.consume();
297        }
298        r
299    }
300
301    fn peek(&mut self) -> Result<Option<u8>, Error> {
302        let buf = self.reader.fill_buf().map_err(Error::io)?;
303        if buf.is_empty() {
304            Ok(None)
305        } else {
306            Ok(Some(buf[0]))
307        }
308    }
309
310    fn consume(&mut self) {
311        self.reader.consume(1);
312    }
313
314    // FIXME ideally we'd be able to avoid a copy by directly referencing the reader's buffer when it has enough data
315    // but that would require some kind of deferred consume handling.
316    fn read<'a>(&'a mut self, n: usize) -> Result<Option<Buf<'a, 'de>>, Error> {
317        if self.fill_buf(n)? {
318            Ok(Some(Buf::Short(&self.buf)))
319        } else {
320            Ok(None)
321        }
322    }
323
324    fn read_mut<'a>(&'a mut self, n: usize) -> Result<Option<MutBuf<'a, 'de>>, Error> {
325        if self.fill_buf(n)? {
326            Ok(Some(MutBuf::Short(&mut self.buf)))
327        } else {
328            Ok(None)
329        }
330    }
331
332    fn read_until<'a>(&'a mut self, end: u8) -> Result<Option<Buf<'a, 'de>>, Error> {
333        self.buf.clear();
334
335        loop {
336            let buf = self.reader.fill_buf().map_err(Error::io)?;
337            if buf.is_empty() {
338                return Ok(None);
339            }
340
341            match memchr(end, buf) {
342                Some(end) => {
343                    self.buf.extend_from_slice(&buf[..end]);
344                    self.reader.consume(end + 1);
345                    return Ok(Some(Buf::Short(&self.buf)));
346                }
347                None => {
348                    self.buf.extend_from_slice(buf);
349                    let len = buf.len();
350                    self.reader.consume(len);
351                }
352            }
353        }
354    }
355}