use bitcoin::io::{self, Read};
use alloc::boxed::Box;
use core::cmp::min;
pub struct Take<'a, R: Read + ?Sized> {
inner: Box<&'a mut R>,
limit: u64,
}
impl<'a, R: Read + ?Sized> Take<'a, R> {
pub fn new(reader: Box<&'a mut R>, limit: u64) -> Self {
Take {
inner: reader,
limit,
}
}
pub fn is_empty(&self) -> bool {
self.limit == 0
}
pub fn remaining(&self) -> u64 {
self.limit
}
}
impl<'a, R: Read + ?Sized> Read for Take<'a, R> {
fn read(&mut self, buf: &mut [u8]) -> Result<usize, io::Error> {
if self.limit == 0 {
return Ok(0);
}
let max = min(self.limit, buf.len() as u64) as usize;
let n = self.inner.read(&mut buf[..max])?;
self.limit -= n as u64;
Ok(n)
}
}