quik_util/
lib.rs

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}