use std::io::{
Read,
Result,
Seek,
SeekFrom,
};
use crate::ext::internal::read_ext_impl;
pub trait ReadSeekExt: Read + Seek {
fn peek_exact_or_eof(&mut self, buffer: &mut [u8]) -> Result<usize>;
fn read_exact_or_eof_at(
&mut self,
offset: u64,
buffer: &mut [u8],
) -> Result<usize>;
}
impl<T> ReadSeekExt for T
where
T: Read + Seek + ?Sized,
{
#[inline]
fn peek_exact_or_eof(&mut self, buffer: &mut [u8]) -> Result<usize> {
let mut reader = self;
let position = reader.stream_position()?;
let read_result = read_ext_impl::read_exact_or_eof(&mut reader, buffer);
let restore_result = reader.seek(SeekFrom::Start(position));
match (read_result, restore_result) {
(Ok(count), Ok(_)) => Ok(count),
(Err(error), Ok(_)) => Err(error),
(_, Err(error)) => Err(error),
}
}
#[inline]
fn read_exact_or_eof_at(
&mut self,
offset: u64,
buffer: &mut [u8],
) -> Result<usize> {
let mut reader = self;
let position = reader.stream_position()?;
let read_result = match reader.seek(SeekFrom::Start(offset)) {
Ok(_) => read_ext_impl::read_exact_or_eof(&mut reader, buffer),
Err(error) => Err(error),
};
let restore_result = reader.seek(SeekFrom::Start(position));
match (read_result, restore_result) {
(Ok(count), Ok(_)) => Ok(count),
(Err(error), Ok(_)) => Err(error),
(_, Err(error)) => Err(error),
}
}
}