msgpack/
lib.rs

1mod code;
2pub mod de;
3pub mod pack;
4mod pack_error;
5mod packer;
6pub mod primitive;
7mod ser;
8pub mod unpack;
9mod unpack_error;
10mod unpacker;
11mod value;
12
13pub use byteorder::ReadBytesExt;
14pub use pack::*;
15pub use pack_error::PackError;
16pub use packer::Packer;
17pub use unpack::*;
18pub use unpack_error::UnpackError;
19pub use unpacker::{InnerBuf, RefUnpacker, Unpacker};
20pub use value::{RefValue, Value};
21
22use std::io::{self, Cursor, Read};
23
24pub trait BufferedRead<'a>: Read {
25    // having same lifetime as BorrowRead
26    fn fill_buf(&self) -> io::Result<&'a [u8]>;
27
28    fn consume(&mut self, len: usize);
29}
30
31impl<'a> BufferedRead<'a> for &'a [u8] {
32    fn fill_buf(&self) -> io::Result<&'a [u8]> {
33        Ok(self)
34    }
35
36    fn consume(&mut self, len: usize) {
37        *self = &(*self)[len..];
38    }
39}
40
41impl<'a> BufferedRead<'a> for Cursor<&'a [u8]> {
42    fn fill_buf(&self) -> io::Result<&'a [u8]> {
43        let len = std::cmp::min(self.position(), self.get_ref().len() as u64);
44        Ok(&self.get_ref()[len as usize..])
45    }
46
47    fn consume(&mut self, len: usize) {
48        let pos = self.position();
49        self.set_position(pos + len as u64);
50    }
51}