protobuf/
coded_input_stream.rs

1#![doc(hidden)]
2
3//! `CodedInputStream` and `CodedOutputStream` implementations
4
5use std::io;
6use std::io::BufRead;
7use std::io::Read;
8use std::mem;
9use std::mem::MaybeUninit;
10use std::slice;
11
12#[cfg(feature = "bytes")]
13use bytes::Bytes;
14
15use crate::buf_read_iter::BufReadIter;
16#[cfg(feature = "bytes")]
17use crate::chars::Chars;
18use crate::enums::ProtobufEnum;
19use crate::error::ProtobufError;
20use crate::error::ProtobufResult;
21use crate::error::WireError;
22use crate::message::Message;
23use crate::misc::maybe_ununit_array_assume_init;
24use crate::unknown::UnknownValue;
25use crate::wire_format;
26use crate::zigzag::decode_zig_zag_32;
27use crate::zigzag::decode_zig_zag_64;
28
29/// Default recursion level limit. 100 is the default value of C++'s implementation.
30const DEFAULT_RECURSION_LIMIT: u32 = 100;
31
32/// Max allocated vec when reading length-delimited from unknown input stream
33pub(crate) const READ_RAW_BYTES_MAX_ALLOC: usize = 10_000_000;
34
35/// Buffered read with handy utilities.
36pub struct CodedInputStream<'a> {
37    source: BufReadIter<'a>,
38    recursion_level: u32,
39    recursion_limit: u32,
40}
41
42impl<'a> CodedInputStream<'a> {
43    /// Wrap a `Read`.
44    ///
45    /// Note resulting `CodedInputStream` is buffered even if `Read` is not.
46    pub fn new(read: &'a mut dyn Read) -> CodedInputStream<'a> {
47        CodedInputStream::from_buf_read_iter(BufReadIter::from_read(read))
48    }
49
50    /// Create from `BufRead`.
51    ///
52    /// `CodedInputStream` will utilize `BufRead` buffer.
53    pub fn from_buffered_reader(buf_read: &'a mut dyn BufRead) -> CodedInputStream<'a> {
54        CodedInputStream::from_buf_read_iter(BufReadIter::from_buf_read(buf_read))
55    }
56
57    /// Read from byte slice
58    pub fn from_bytes(bytes: &'a [u8]) -> CodedInputStream<'a> {
59        CodedInputStream::from_buf_read_iter(BufReadIter::from_byte_slice(bytes))
60    }
61
62    /// Read from `Bytes`.
63    ///
64    /// `CodedInputStream` operations like
65    /// [`read_carllerche_bytes`](crate::CodedInputStream::read_carllerche_bytes)
66    /// will return a shared copy of this bytes object.
67    #[cfg(feature = "bytes")]
68    pub fn from_carllerche_bytes(bytes: &'a Bytes) -> CodedInputStream<'a> {
69        CodedInputStream::from_buf_read_iter(BufReadIter::from_bytes(bytes))
70    }
71
72    fn from_buf_read_iter(source: BufReadIter<'a>) -> CodedInputStream<'a> {
73        CodedInputStream {
74            source: source,
75            recursion_level: 0,
76            recursion_limit: DEFAULT_RECURSION_LIMIT,
77        }
78    }
79
80    /// Set the recursion limit.
81    pub fn set_recursion_limit(&mut self, limit: u32) {
82        self.recursion_limit = limit;
83    }
84
85    #[inline]
86    pub(crate) fn incr_recursion(&mut self) -> ProtobufResult<()> {
87        if self.recursion_level >= self.recursion_limit {
88            return Err(ProtobufError::WireError(WireError::OverRecursionLimit));
89        }
90        self.recursion_level += 1;
91        Ok(())
92    }
93
94    #[inline]
95    pub(crate) fn decr_recursion(&mut self) {
96        self.recursion_level -= 1;
97    }
98
99    /// How many bytes processed
100    pub fn pos(&self) -> u64 {
101        self.source.pos()
102    }
103
104    /// How many bytes until current limit
105    pub fn bytes_until_limit(&self) -> u64 {
106        self.source.bytes_until_limit()
107    }
108
109    /// Read bytes into given `buf`.
110    #[inline]
111    fn read_exact_uninit(&mut self, buf: &mut [MaybeUninit<u8>]) -> ProtobufResult<()> {
112        self.source.read_exact(buf)
113    }
114
115    /// Read bytes into given `buf`.
116    ///
117    /// Return `0` on EOF.
118    // TODO: overload with `Read::read`
119    pub fn read(&mut self, buf: &mut [u8]) -> ProtobufResult<()> {
120        // SAFETY: same layout
121        let buf = unsafe {
122            slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut MaybeUninit<u8>, buf.len())
123        };
124        self.read_exact_uninit(buf)
125    }
126
127    /// Read exact number of bytes as `Bytes` object.
128    ///
129    /// This operation returns a shared view if `CodedInputStream` is
130    /// constructed with `Bytes` parameter.
131    #[cfg(feature = "bytes")]
132    fn read_raw_callerche_bytes(&mut self, count: usize) -> ProtobufResult<Bytes> {
133        self.source.read_exact_bytes(count)
134    }
135
136    /// Read one byte
137    #[inline(always)]
138    pub fn read_raw_byte(&mut self) -> ProtobufResult<u8> {
139        self.source.read_byte()
140    }
141
142    /// Push new limit, return previous limit.
143    pub fn push_limit(&mut self, limit: u64) -> ProtobufResult<u64> {
144        self.source.push_limit(limit)
145    }
146
147    /// Restore previous limit.
148    pub fn pop_limit(&mut self, old_limit: u64) {
149        self.source.pop_limit(old_limit);
150    }
151
152    /// Are we at EOF?
153    #[inline(always)]
154    pub fn eof(&mut self) -> ProtobufResult<bool> {
155        self.source.eof()
156    }
157
158    /// Check we are at EOF.
159    ///
160    /// Return error if we are not at EOF.
161    pub fn check_eof(&mut self) -> ProtobufResult<()> {
162        let eof = self.eof()?;
163        if !eof {
164            return Err(ProtobufError::WireError(WireError::UnexpectedEof));
165        }
166        Ok(())
167    }
168
169    fn read_raw_varint64_slow(&mut self) -> ProtobufResult<u64> {
170        let mut r: u64 = 0;
171        let mut i = 0;
172        loop {
173            if i == 10 {
174                return Err(ProtobufError::WireError(WireError::IncorrectVarint));
175            }
176            let b = self.read_raw_byte()?;
177            // TODO: may overflow if i == 9
178            r = r | (((b & 0x7f) as u64) << (i * 7));
179            i += 1;
180            if b < 0x80 {
181                return Ok(r);
182            }
183        }
184    }
185
186    /// Read varint
187    #[inline(always)]
188    pub fn read_raw_varint64(&mut self) -> ProtobufResult<u64> {
189        'slow: loop {
190            let ret;
191            let consume;
192
193            loop {
194                let rem = self.source.remaining_in_buf();
195
196                if rem.len() >= 1 {
197                    // most varints are in practice fit in 1 byte
198                    if rem[0] < 0x80 {
199                        ret = rem[0] as u64;
200                        consume = 1;
201                    } else {
202                        // handle case of two bytes too
203                        if rem.len() >= 2 && rem[1] < 0x80 {
204                            ret = (rem[0] & 0x7f) as u64 | (rem[1] as u64) << 7;
205                            consume = 2;
206                        } else if rem.len() >= 10 {
207                            // Read from array when buf at at least 10 bytes,
208                            // max len for varint.
209                            let mut r: u64 = 0;
210                            let mut i: usize = 0;
211                            {
212                                let rem = rem;
213                                loop {
214                                    if i == 10 {
215                                        return Err(ProtobufError::WireError(
216                                            WireError::IncorrectVarint,
217                                        ));
218                                    }
219
220                                    let b = if true {
221                                        // skip range check
222                                        unsafe { *rem.get_unchecked(i) }
223                                    } else {
224                                        rem[i]
225                                    };
226
227                                    // TODO: may overflow if i == 9
228                                    r = r | (((b & 0x7f) as u64) << (i * 7));
229                                    i += 1;
230                                    if b < 0x80 {
231                                        break;
232                                    }
233                                }
234                            }
235                            consume = i;
236                            ret = r;
237                        } else {
238                            break 'slow;
239                        }
240                    }
241                } else {
242                    break 'slow;
243                }
244                break;
245            }
246
247            self.source.consume(consume);
248            return Ok(ret);
249        }
250
251        self.read_raw_varint64_slow()
252    }
253
254    /// Read varint
255    #[inline(always)]
256    pub fn read_raw_varint32(&mut self) -> ProtobufResult<u32> {
257        self.read_raw_varint64().map(|v| v as u32)
258    }
259
260    /// Read little-endian 32-bit integer
261    pub fn read_raw_little_endian32(&mut self) -> ProtobufResult<u32> {
262        let mut bytes = [MaybeUninit::uninit(); 4];
263        self.read_exact_uninit(&mut bytes)?;
264        // SAFETY: `read_exact` guarantees that the buffer is filled.
265        let bytes = unsafe { maybe_ununit_array_assume_init(bytes) };
266        Ok(u32::from_le_bytes(bytes))
267    }
268
269    /// Read little-endian 64-bit integer
270    pub fn read_raw_little_endian64(&mut self) -> ProtobufResult<u64> {
271        let mut bytes = [MaybeUninit::uninit(); 8];
272        self.read_exact_uninit(&mut bytes)?;
273        // SAFETY: `read_exact` guarantees that the buffer is filled.
274        let bytes = unsafe { maybe_ununit_array_assume_init(bytes) };
275        Ok(u64::from_le_bytes(bytes))
276    }
277
278    /// Read tag
279    #[inline]
280    pub fn read_tag(&mut self) -> ProtobufResult<wire_format::Tag> {
281        let v = self.read_raw_varint32()?;
282        match wire_format::Tag::new(v) {
283            Some(tag) => Ok(tag),
284            None => Err(ProtobufError::WireError(WireError::IncorrectTag(v))),
285        }
286    }
287
288    /// Read tag, return it is pair (field number, wire type)
289    #[inline]
290    pub fn read_tag_unpack(&mut self) -> ProtobufResult<(u32, wire_format::WireType)> {
291        self.read_tag().map(|t| t.unpack())
292    }
293
294    /// Read `double`
295    pub fn read_double(&mut self) -> ProtobufResult<f64> {
296        let bits = self.read_raw_little_endian64()?;
297        unsafe { Ok(mem::transmute::<u64, f64>(bits)) }
298    }
299
300    /// Read `float`
301    pub fn read_float(&mut self) -> ProtobufResult<f32> {
302        let bits = self.read_raw_little_endian32()?;
303        unsafe { Ok(mem::transmute::<u32, f32>(bits)) }
304    }
305
306    /// Read `int64`
307    pub fn read_int64(&mut self) -> ProtobufResult<i64> {
308        self.read_raw_varint64().map(|v| v as i64)
309    }
310
311    /// Read `int32`
312    pub fn read_int32(&mut self) -> ProtobufResult<i32> {
313        self.read_raw_varint32().map(|v| v as i32)
314    }
315
316    /// Read `uint64`
317    pub fn read_uint64(&mut self) -> ProtobufResult<u64> {
318        self.read_raw_varint64()
319    }
320
321    /// Read `uint32`
322    pub fn read_uint32(&mut self) -> ProtobufResult<u32> {
323        self.read_raw_varint32()
324    }
325
326    /// Read `sint64`
327    pub fn read_sint64(&mut self) -> ProtobufResult<i64> {
328        self.read_uint64().map(decode_zig_zag_64)
329    }
330
331    /// Read `sint32`
332    pub fn read_sint32(&mut self) -> ProtobufResult<i32> {
333        self.read_uint32().map(decode_zig_zag_32)
334    }
335
336    /// Read `fixed64`
337    pub fn read_fixed64(&mut self) -> ProtobufResult<u64> {
338        self.read_raw_little_endian64()
339    }
340
341    /// Read `fixed32`
342    pub fn read_fixed32(&mut self) -> ProtobufResult<u32> {
343        self.read_raw_little_endian32()
344    }
345
346    /// Read `sfixed64`
347    pub fn read_sfixed64(&mut self) -> ProtobufResult<i64> {
348        self.read_raw_little_endian64().map(|v| v as i64)
349    }
350
351    /// Read `sfixed32`
352    pub fn read_sfixed32(&mut self) -> ProtobufResult<i32> {
353        self.read_raw_little_endian32().map(|v| v as i32)
354    }
355
356    /// Read `bool`
357    pub fn read_bool(&mut self) -> ProtobufResult<bool> {
358        self.read_raw_varint32().map(|v| v != 0)
359    }
360
361    /// Read `enum` as `ProtobufEnum`
362    pub fn read_enum<E: ProtobufEnum>(&mut self) -> ProtobufResult<E> {
363        let i = self.read_int32()?;
364        match ProtobufEnum::from_i32(i) {
365            Some(e) => Ok(e),
366            None => Err(ProtobufError::WireError(WireError::InvalidEnumValue(i))),
367        }
368    }
369
370    /// Read `repeated` packed `double`
371    pub fn read_repeated_packed_double_into(
372        &mut self,
373        target: &mut Vec<f64>,
374    ) -> ProtobufResult<()> {
375        let len = self.read_raw_varint64()?;
376
377        target.reserve((len / 4) as usize);
378
379        let old_limit = self.push_limit(len)?;
380        while !self.eof()? {
381            target.push(self.read_double()?);
382        }
383        self.pop_limit(old_limit);
384        Ok(())
385    }
386
387    /// Read `repeated` packed `float`
388    pub fn read_repeated_packed_float_into(&mut self, target: &mut Vec<f32>) -> ProtobufResult<()> {
389        let len = self.read_raw_varint64()?;
390
391        target.reserve((len / 4) as usize);
392
393        let old_limit = self.push_limit(len)?;
394        while !self.eof()? {
395            target.push(self.read_float()?);
396        }
397        self.pop_limit(old_limit);
398        Ok(())
399    }
400
401    /// Read `repeated` packed `int64`
402    pub fn read_repeated_packed_int64_into(&mut self, target: &mut Vec<i64>) -> ProtobufResult<()> {
403        let len = self.read_raw_varint64()?;
404        let old_limit = self.push_limit(len as u64)?;
405        while !self.eof()? {
406            target.push(self.read_int64()?);
407        }
408        self.pop_limit(old_limit);
409        Ok(())
410    }
411
412    /// Read repeated packed `int32`
413    pub fn read_repeated_packed_int32_into(&mut self, target: &mut Vec<i32>) -> ProtobufResult<()> {
414        let len = self.read_raw_varint64()?;
415        let old_limit = self.push_limit(len)?;
416        while !self.eof()? {
417            target.push(self.read_int32()?);
418        }
419        self.pop_limit(old_limit);
420        Ok(())
421    }
422
423    /// Read repeated packed `uint64`
424    pub fn read_repeated_packed_uint64_into(
425        &mut self,
426        target: &mut Vec<u64>,
427    ) -> ProtobufResult<()> {
428        let len = self.read_raw_varint64()?;
429        let old_limit = self.push_limit(len)?;
430        while !self.eof()? {
431            target.push(self.read_uint64()?);
432        }
433        self.pop_limit(old_limit);
434        Ok(())
435    }
436
437    /// Read repeated packed `uint32`
438    pub fn read_repeated_packed_uint32_into(
439        &mut self,
440        target: &mut Vec<u32>,
441    ) -> ProtobufResult<()> {
442        let len = self.read_raw_varint64()?;
443        let old_limit = self.push_limit(len)?;
444        while !self.eof()? {
445            target.push(self.read_uint32()?);
446        }
447        self.pop_limit(old_limit);
448        Ok(())
449    }
450
451    /// Read repeated packed `sint64`
452    pub fn read_repeated_packed_sint64_into(
453        &mut self,
454        target: &mut Vec<i64>,
455    ) -> ProtobufResult<()> {
456        let len = self.read_raw_varint64()?;
457        let old_limit = self.push_limit(len)?;
458        while !self.eof()? {
459            target.push(self.read_sint64()?);
460        }
461        self.pop_limit(old_limit);
462        Ok(())
463    }
464
465    /// Read repeated packed `sint32`
466    pub fn read_repeated_packed_sint32_into(
467        &mut self,
468        target: &mut Vec<i32>,
469    ) -> ProtobufResult<()> {
470        let len = self.read_raw_varint64()?;
471        let old_limit = self.push_limit(len)?;
472        while !self.eof()? {
473            target.push(self.read_sint32()?);
474        }
475        self.pop_limit(old_limit);
476        Ok(())
477    }
478
479    /// Read repeated packed `fixed64`
480    pub fn read_repeated_packed_fixed64_into(
481        &mut self,
482        target: &mut Vec<u64>,
483    ) -> ProtobufResult<()> {
484        let len = self.read_raw_varint64()?;
485
486        target.reserve((len / 8) as usize);
487
488        let old_limit = self.push_limit(len)?;
489        while !self.eof()? {
490            target.push(self.read_fixed64()?);
491        }
492        self.pop_limit(old_limit);
493        Ok(())
494    }
495
496    /// Read repeated packed `fixed32`
497    pub fn read_repeated_packed_fixed32_into(
498        &mut self,
499        target: &mut Vec<u32>,
500    ) -> ProtobufResult<()> {
501        let len = self.read_raw_varint64()?;
502
503        target.reserve((len / 4) as usize);
504
505        let old_limit = self.push_limit(len)?;
506        while !self.eof()? {
507            target.push(self.read_fixed32()?);
508        }
509        self.pop_limit(old_limit);
510        Ok(())
511    }
512
513    /// Read repeated packed `sfixed64`
514    pub fn read_repeated_packed_sfixed64_into(
515        &mut self,
516        target: &mut Vec<i64>,
517    ) -> ProtobufResult<()> {
518        let len = self.read_raw_varint64()?;
519
520        target.reserve((len / 8) as usize);
521
522        let old_limit = self.push_limit(len)?;
523        while !self.eof()? {
524            target.push(self.read_sfixed64()?);
525        }
526        self.pop_limit(old_limit);
527        Ok(())
528    }
529
530    /// Read repeated packed `sfixed32`
531    pub fn read_repeated_packed_sfixed32_into(
532        &mut self,
533        target: &mut Vec<i32>,
534    ) -> ProtobufResult<()> {
535        let len = self.read_raw_varint64()?;
536
537        target.reserve((len / 4) as usize);
538
539        let old_limit = self.push_limit(len)?;
540        while !self.eof()? {
541            target.push(self.read_sfixed32()?);
542        }
543        self.pop_limit(old_limit);
544        Ok(())
545    }
546
547    /// Read repeated packed `bool`
548    pub fn read_repeated_packed_bool_into(&mut self, target: &mut Vec<bool>) -> ProtobufResult<()> {
549        let len = self.read_raw_varint64()?;
550
551        // regular bool value is 1-byte size
552        target.reserve(len as usize);
553
554        let old_limit = self.push_limit(len)?;
555        while !self.eof()? {
556            target.push(self.read_bool()?);
557        }
558        self.pop_limit(old_limit);
559        Ok(())
560    }
561
562    /// Read repeated packed `enum` into `ProtobufEnum`
563    pub fn read_repeated_packed_enum_into<E: ProtobufEnum>(
564        &mut self,
565        target: &mut Vec<E>,
566    ) -> ProtobufResult<()> {
567        let len = self.read_raw_varint64()?;
568        let old_limit = self.push_limit(len)?;
569        while !self.eof()? {
570            target.push(self.read_enum()?);
571        }
572        self.pop_limit(old_limit);
573        Ok(())
574    }
575
576    /// Read `UnknownValue`
577    pub fn read_unknown(
578        &mut self,
579        wire_type: wire_format::WireType,
580    ) -> ProtobufResult<UnknownValue> {
581        match wire_type {
582            wire_format::WireTypeVarint => {
583                self.read_raw_varint64().map(|v| UnknownValue::Varint(v))
584            }
585            wire_format::WireTypeFixed64 => self.read_fixed64().map(|v| UnknownValue::Fixed64(v)),
586            wire_format::WireTypeFixed32 => self.read_fixed32().map(|v| UnknownValue::Fixed32(v)),
587            wire_format::WireTypeLengthDelimited => {
588                let len = self.read_raw_varint32()?;
589                self.read_raw_bytes(len)
590                    .map(|v| UnknownValue::LengthDelimited(v))
591            }
592            _ => Err(ProtobufError::WireError(WireError::UnexpectedWireType(
593                wire_type,
594            ))),
595        }
596    }
597
598    /// Skip field
599    pub fn skip_field(&mut self, wire_type: wire_format::WireType) -> ProtobufResult<()> {
600        self.read_unknown(wire_type).map(|_| ())
601    }
602
603    /// Read raw bytes into the supplied vector.  The vector will be resized as needed and
604    /// overwritten.
605    pub fn read_raw_bytes_into(&mut self, count: u32, target: &mut Vec<u8>) -> ProtobufResult<()> {
606        self.source.read_exact_to_vec(count as usize, target)
607    }
608
609    /// Read exact number of bytes
610    pub fn read_raw_bytes(&mut self, count: u32) -> ProtobufResult<Vec<u8>> {
611        let mut r = Vec::new();
612        self.read_raw_bytes_into(count, &mut r)?;
613        Ok(r)
614    }
615
616    /// Skip exact number of bytes
617    pub fn skip_raw_bytes(&mut self, count: u32) -> ProtobufResult<()> {
618        // TODO: make it more efficient
619        self.read_raw_bytes(count).map(|_| ())
620    }
621
622    /// Read `bytes` field, length delimited
623    pub fn read_bytes(&mut self) -> ProtobufResult<Vec<u8>> {
624        let mut r = Vec::new();
625        self.read_bytes_into(&mut r)?;
626        Ok(r)
627    }
628
629    /// Read `bytes` field, length delimited
630    #[cfg(feature = "bytes")]
631    pub fn read_carllerche_bytes(&mut self) -> ProtobufResult<Bytes> {
632        let len = self.read_raw_varint32()?;
633        self.read_raw_callerche_bytes(len as usize)
634    }
635
636    /// Read `string` field, length delimited
637    #[cfg(feature = "bytes")]
638    pub fn read_carllerche_chars(&mut self) -> ProtobufResult<Chars> {
639        let bytes = self.read_carllerche_bytes()?;
640        Ok(Chars::from_bytes(bytes)?)
641    }
642
643    /// Read `bytes` field, length delimited
644    pub fn read_bytes_into(&mut self, target: &mut Vec<u8>) -> ProtobufResult<()> {
645        let len = self.read_raw_varint32()?;
646        self.read_raw_bytes_into(len, target)?;
647        Ok(())
648    }
649
650    /// Read `string` field, length delimited
651    pub fn read_string(&mut self) -> ProtobufResult<String> {
652        let mut r = String::new();
653        self.read_string_into(&mut r)?;
654        Ok(r)
655    }
656
657    /// Read `string` field, length delimited
658    pub fn read_string_into(&mut self, target: &mut String) -> ProtobufResult<()> {
659        target.clear();
660        // take target's buffer
661        let mut vec = mem::replace(target, String::new()).into_bytes();
662        self.read_bytes_into(&mut vec)?;
663
664        let s = match String::from_utf8(vec) {
665            Ok(t) => t,
666            Err(_) => return Err(ProtobufError::WireError(WireError::Utf8Error)),
667        };
668        *target = s;
669        Ok(())
670    }
671
672    /// Read message, do not check if message is initialized
673    pub fn merge_message<M: Message>(&mut self, message: &mut M) -> ProtobufResult<()> {
674        let len = self.read_raw_varint64()?;
675        let old_limit = self.push_limit(len)?;
676        message.merge_from(self)?;
677        self.pop_limit(old_limit);
678        Ok(())
679    }
680
681    /// Read message
682    pub fn read_message<M: Message>(&mut self) -> ProtobufResult<M> {
683        let mut r: M = Message::new();
684        self.merge_message(&mut r)?;
685        r.check_initialized()?;
686        Ok(r)
687    }
688}
689
690impl<'a> Read for CodedInputStream<'a> {
691    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
692        self.source.read(buf).map_err(Into::into)
693    }
694}
695
696impl<'a> BufRead for CodedInputStream<'a> {
697    fn fill_buf(&mut self) -> io::Result<&[u8]> {
698        self.source.fill_buf().map_err(Into::into)
699    }
700
701    fn consume(&mut self, amt: usize) {
702        self.source.consume(amt)
703    }
704}
705
706/// Helper internal utility, should not be used directly
707#[doc(hidden)]
708pub trait WithCodedInputStream {
709    fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
710    where
711        F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>;
712}
713
714impl<'a> WithCodedInputStream for &'a mut (dyn Read + 'a) {
715    fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
716    where
717        F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>,
718    {
719        let mut is = CodedInputStream::new(self);
720        let r = cb(&mut is)?;
721        is.check_eof()?;
722        Ok(r)
723    }
724}
725
726impl<'a> WithCodedInputStream for &'a mut (dyn BufRead + 'a) {
727    fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
728    where
729        F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>,
730    {
731        let mut is = CodedInputStream::from_buffered_reader(self);
732        let r = cb(&mut is)?;
733        is.check_eof()?;
734        Ok(r)
735    }
736}
737
738impl<'a> WithCodedInputStream for &'a [u8] {
739    fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
740    where
741        F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>,
742    {
743        let mut is = CodedInputStream::from_bytes(self);
744        let r = cb(&mut is)?;
745        is.check_eof()?;
746        Ok(r)
747    }
748}
749
750#[cfg(feature = "bytes")]
751impl<'a> WithCodedInputStream for &'a Bytes {
752    fn with_coded_input_stream<T, F>(self, cb: F) -> ProtobufResult<T>
753    where
754        F: FnOnce(&mut CodedInputStream) -> ProtobufResult<T>,
755    {
756        let mut is = CodedInputStream::from_carllerche_bytes(self);
757        let r = cb(&mut is)?;
758        is.check_eof()?;
759        Ok(r)
760    }
761}
762
763#[cfg(test)]
764mod test {
765
766    use std::fmt::Debug;
767    use std::io;
768    use std::io::BufRead;
769    use std::io::Read;
770
771    use super::CodedInputStream;
772    use super::READ_RAW_BYTES_MAX_ALLOC;
773    use crate::error::ProtobufError;
774    use crate::error::ProtobufResult;
775    use crate::hex::decode_hex;
776
777    fn test_read_partial<F>(hex: &str, mut callback: F)
778    where
779        F: FnMut(&mut CodedInputStream),
780    {
781        let d = decode_hex(hex);
782        let mut reader = io::Cursor::new(d);
783        let mut is = CodedInputStream::from_buffered_reader(&mut reader as &mut dyn BufRead);
784        assert_eq!(0, is.pos());
785        callback(&mut is);
786    }
787
788    fn test_read<F>(hex: &str, mut callback: F)
789    where
790        F: FnMut(&mut CodedInputStream),
791    {
792        let len = decode_hex(hex).len();
793        test_read_partial(hex, |reader| {
794            callback(reader);
795            assert!(reader.eof().expect("eof"));
796            assert_eq!(len as u64, reader.pos());
797        });
798    }
799
800    fn test_read_v<F, V>(hex: &str, v: V, mut callback: F)
801    where
802        F: FnMut(&mut CodedInputStream) -> ProtobufResult<V>,
803        V: PartialEq + Debug,
804    {
805        test_read(hex, |reader| {
806            assert_eq!(v, callback(reader).unwrap());
807        });
808    }
809
810    #[test]
811    fn test_input_stream_read_raw_byte() {
812        test_read("17", |is| {
813            assert_eq!(23, is.read_raw_byte().unwrap());
814        });
815    }
816
817    #[test]
818    fn test_input_stream_read_raw_varint() {
819        test_read_v("07", 7, |reader| reader.read_raw_varint32());
820        test_read_v("07", 7, |reader| reader.read_raw_varint64());
821
822        test_read_v("96 01", 150, |reader| reader.read_raw_varint32());
823        test_read_v("96 01", 150, |reader| reader.read_raw_varint64());
824
825        test_read_v(
826            "ff ff ff ff ff ff ff ff ff 01",
827            0xffffffffffffffff,
828            |reader| reader.read_raw_varint64(),
829        );
830
831        test_read_v("ff ff ff ff 0f", 0xffffffff, |reader| {
832            reader.read_raw_varint32()
833        });
834        test_read_v("ff ff ff ff 0f", 0xffffffff, |reader| {
835            reader.read_raw_varint64()
836        });
837    }
838
839    #[test]
840    fn test_input_stream_read_raw_vaint_malformed() {
841        // varint cannot have length > 10
842        test_read_partial("ff ff ff ff ff ff ff ff ff ff 01", |reader| {
843            let result = reader.read_raw_varint64();
844            match result {
845                // TODO: make an enum variant
846                Err(ProtobufError::WireError(..)) => (),
847                _ => panic!(),
848            }
849        });
850        test_read_partial("ff ff ff ff ff ff ff ff ff ff 01", |reader| {
851            let result = reader.read_raw_varint32();
852            match result {
853                // TODO: make an enum variant
854                Err(ProtobufError::WireError(..)) => (),
855                _ => panic!(),
856            }
857        });
858    }
859
860    #[test]
861    fn test_input_stream_read_raw_varint_unexpected_eof() {
862        test_read_partial("96 97", |reader| {
863            let result = reader.read_raw_varint32();
864            match result {
865                Err(ProtobufError::WireError(..)) => (),
866                _ => panic!(),
867            }
868        });
869    }
870
871    #[test]
872    fn test_input_stream_read_raw_varint_pos() {
873        test_read_partial("95 01 98", |reader| {
874            assert_eq!(149, reader.read_raw_varint32().unwrap());
875            assert_eq!(2, reader.pos());
876        });
877    }
878
879    #[test]
880    fn test_input_stream_read_int32() {
881        test_read_v("02", 2, |reader| reader.read_int32());
882    }
883
884    #[test]
885    fn test_input_stream_read_float() {
886        test_read_v("95 73 13 61", 17e19, |is| is.read_float());
887    }
888
889    #[test]
890    fn test_input_stream_read_double() {
891        test_read_v("40 d5 ab 68 b3 07 3d 46", 23e29, |is| is.read_double());
892    }
893
894    #[test]
895    fn test_input_stream_skip_raw_bytes() {
896        test_read("", |reader| {
897            reader.skip_raw_bytes(0).unwrap();
898        });
899        test_read("aa bb", |reader| {
900            reader.skip_raw_bytes(2).unwrap();
901        });
902        test_read("aa bb cc dd ee ff", |reader| {
903            reader.skip_raw_bytes(6).unwrap();
904        });
905    }
906
907    #[test]
908    fn test_input_stream_read_raw_bytes() {
909        test_read("", |reader| {
910            assert_eq!(
911                Vec::from(&b""[..]),
912                reader.read_raw_bytes(0).expect("read_raw_bytes")
913            );
914        })
915    }
916
917    #[test]
918    fn test_input_stream_limits() {
919        test_read("aa bb cc", |is| {
920            let old_limit = is.push_limit(1).unwrap();
921            assert_eq!(1, is.bytes_until_limit());
922            let r1 = is.read_raw_bytes(1).unwrap();
923            assert_eq!(&[0xaa as u8], &r1[..]);
924            is.pop_limit(old_limit);
925            let r2 = is.read_raw_bytes(2).unwrap();
926            assert_eq!(&[0xbb as u8, 0xcc], &r2[..]);
927        });
928    }
929
930    #[test]
931    fn test_input_stream_io_read() {
932        test_read("aa bb cc", |is| {
933            let mut buf = [0; 3];
934            assert_eq!(Read::read(is, &mut buf).expect("io::Read"), 3);
935            assert_eq!(buf, [0xaa, 0xbb, 0xcc]);
936        });
937    }
938
939    #[test]
940    fn test_input_stream_io_bufread() {
941        test_read("aa bb cc", |is| {
942            assert_eq!(
943                BufRead::fill_buf(is).expect("io::BufRead::fill_buf"),
944                &[0xaa, 0xbb, 0xcc]
945            );
946            BufRead::consume(is, 3);
947        });
948    }
949
950    #[test]
951    fn test_input_stream_read_raw_bytes_into_huge() {
952        let mut v = Vec::new();
953        for i in 0..READ_RAW_BYTES_MAX_ALLOC + 1000 {
954            v.push((i % 10) as u8);
955        }
956
957        let mut slice: &[u8] = v.as_slice();
958
959        let mut is = CodedInputStream::new(&mut slice);
960
961        let mut buf = Vec::new();
962
963        is.read_raw_bytes_into(READ_RAW_BYTES_MAX_ALLOC as u32 + 10, &mut buf)
964            .expect("read");
965
966        assert_eq!(READ_RAW_BYTES_MAX_ALLOC + 10, buf.len());
967
968        buf.clear();
969
970        is.read_raw_bytes_into(1000 - 10, &mut buf).expect("read");
971
972        assert_eq!(1000 - 10, buf.len());
973
974        assert!(is.eof().expect("eof"));
975    }
976}