use crate::BorrowedCursor;
use std::io::{self, ErrorKind, IoSlice, Read, Write};
#[inline]
pub fn read_buf<R: Read + ?Sized>(
reader: &mut R,
mut cursor: BorrowedCursor<'_, u8>,
) -> io::Result<()> {
let n = reader.read(cursor.ensure_init())?;
cursor.advance_checked(n);
Ok(())
}
pub fn read_buf_exact<R: Read + ?Sized>(
reader: &mut R,
mut cursor: BorrowedCursor<'_, u8>,
) -> io::Result<()> {
while cursor.capacity() > 0 {
let before = cursor.written();
match read_buf(reader, cursor.reborrow()) {
Ok(()) if cursor.written() == before => {
return Err(io::Error::new(
ErrorKind::UnexpectedEof,
"failed to fill whole buffer",
));
}
Ok(()) => {}
Err(e) if e.kind() == ErrorKind::Interrupted => {}
Err(e) => return Err(e),
}
}
Ok(())
}
impl Write for BorrowedCursor<'_, u8> {
#[inline]
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
let n = buf.len().min(self.capacity());
self.append(&buf[..n]);
Ok(n)
}
#[inline]
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
let mut written = 0;
for buf in bufs {
let n = self.write(buf)?;
written += n;
if n < buf.len() {
break;
}
}
Ok(written)
}
#[inline]
fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
if self.write(buf)? < buf.len() {
Err(io::Error::new(
ErrorKind::WriteZero,
"failed to write whole buffer",
))
} else {
Ok(())
}
}
#[inline]
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}