use crate::{IoRead, IoResult, IoWrite, is};
impl<T: IoRead + IoWrite> IoDuplex for T {}
#[doc = crate::_tags!(io)]
pub trait IoDuplex: IoRead + IoWrite {
fn read_at_least(&mut self, buf: &mut [u8], min: usize) -> IoResult<usize> {
let mut filled = 0;
while filled < min {
let n = self.read(&mut buf[filled..])?;
is![n == 0, break];
filled += n;
}
Ok(filled)
}
fn copy_to<W: IoWrite>(&mut self, out: &mut W) -> IoResult<u64> {
const BUF: usize = 8 * 1024;
let mut tmp = [0u8; BUF];
let mut total = 0u64;
loop {
let n = self.read(&mut tmp)?;
is![n == 0, break];
out.write_all(&tmp[..n])?;
total += n as u64;
}
Ok(total)
}
fn read_until_byte(&mut self, delim: u8, out: &mut [u8]) -> IoResult<usize> {
let mut count = 0;
for slot in out.iter_mut() {
let mut b = [0];
let n = self.read(&mut b)?;
is![n == 0, break];
*slot = b[0];
count += 1;
is![b[0] == delim, break];
}
Ok(count)
}
}