use crate::error::*;
use std::io::{self, Read};
pub fn read_at_most_into<R: Read>(r: &mut R, mut buf: &mut [u8]) -> Result<usize> {
let maximum_bytes: usize = buf.len();
let mut read_bytes: usize = 0;
let mut hit_eof: bool = false;
while !buf.is_empty() {
match r.read(buf) {
Ok(0) => {
hit_eof = true;
break;
}
Ok(n) => {
read_bytes += n;
let tmp = buf;
buf = &mut tmp[n..];
}
Err(ref e) if e.kind() == io::ErrorKind::Interrupted => {}
Err(e) => return Err(e.into()),
}
}
if !hit_eof {
match r.bytes().next() {
None => {
hit_eof = true;
}
Some(Ok(_)) => {}
Some(Err(e)) => return Err(e.into()),
};
}
if !hit_eof {
return Err(Error::InputTooBig(format!(
"refusing to read more bytes; expected at most {}",
maximum_bytes
)));
}
Ok(read_bytes)
}
pub fn read_at_most<R: Read>(r: &mut R, maximum_bytes: usize) -> Result<Vec<u8>> {
let mut buf = vec![0; maximum_bytes];
let bytes_read = read_at_most_into(r, buf.as_mut_slice())?;
buf.truncate(bytes_read);
Ok(buf)
}