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 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}