use std::io::{ self, Read, Write };
pub trait ReadExt {
fn read_until(&mut self, buf: &mut[u8], pat: impl AsRef<[u8]>)
-> Result<Option<usize>, io::Error>;
}
impl<T: Read> ReadExt for T {
fn read_until(&mut self, buf: &mut[u8], pat: impl AsRef<[u8]>)
-> Result<Option<usize>, io::Error>
{
let pat = pat.as_ref();
let mut pos = 0;
while pos < buf.len() {
match self.read_exact(&mut buf[pos .. pos + 1]) {
Ok(_) => pos += 1,
Err(e) => match e.kind() {
io::ErrorKind::UnexpectedEof => return Ok(None),
e => Err(e)?
}
}
if pos >= pat.len() && &buf[pos - pat.len() .. pos] == pat {
return Ok(Some(pos))
}
}
Ok(None)
}
}
pub trait WriteExt {
fn write(&mut self, data: impl AsRef<[u8]>) -> Result<&mut Self, io::Error>;
}
impl<T: Write> WriteExt for T {
fn write(&mut self, data: impl AsRef<[u8]>) -> Result<&mut Self, io::Error> {
self.write_all(data.as_ref())?;
Ok(self)
}
}