1pub use std::future::*;
2
3pub use byteorder::{ByteOrder, NetworkEndian, ReadBytesExt};
4pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
5
6pub trait Buffer: ReadBytesExt {
7 fn slice(&mut self, len: usize) -> Result<Self>
8 where
9 Self: Sized;
10 fn extract(&mut self, off: Option<usize>, len: Option<usize>) -> Result<Self>
11 where
12 Self: Sized;
13}
14
15impl Buffer for &[u8] {
16 fn slice(&mut self, len: usize) -> Result<Self> {
17 let ret;
18 (ret, *self) = self
19 .split_at_checked(len)
20 .ok_or_else(|| "Buffer too short")?;
21 Ok(ret)
22 }
23
24 fn extract(&mut self, off: Option<usize>, len: Option<usize>) -> Result<Self> {
25 let ret;
26 if let Some(off) = off {
27 (_, *self) = self
28 .split_at_checked(off)
29 .ok_or_else(|| "Buffer too short for offset")?;
30 }
31 if let Some(len) = len {
32 (ret, *self) = self
33 .split_at_checked(len)
34 .ok_or_else(|| "Buffer too short for length")?;
35 return Ok(ret);
36 }
37 let data = *self;
38 *self = &[];
39 Ok(data)
40 }
41}