use binrw::io;
use binrw::io::{Read, Seek, SeekFrom};
use crate::error::{NtfsError, Result};
pub trait NtfsReadSeek {
fn read<T>(&mut self, fs: &mut T, buf: &mut [u8]) -> Result<usize>
where
T: Read + Seek;
fn read_exact<T>(&mut self, fs: &mut T, mut buf: &mut [u8]) -> Result<()>
where
T: Read + Seek,
{
while !buf.is_empty() {
match self.read(fs, buf) {
Ok(0) => break,
Ok(n) => {
buf = &mut buf[n..];
}
Err(NtfsError::Io(e)) if e.kind() == io::ErrorKind::Interrupted => {}
Err(e) => return Err(e),
}
}
if !buf.is_empty() {
Err(NtfsError::Io(io::Error::new(
io::ErrorKind::UnexpectedEof,
"failed to fill whole buffer",
)))
} else {
Ok(())
}
}
fn seek<T>(&mut self, fs: &mut T, pos: SeekFrom) -> Result<u64>
where
T: Read + Seek;
fn stream_position(&self) -> u64;
}