use std::io::{Read, Seek};
pub struct SeekerWithOffset<S> {
inner: S,
pos: u64,
pos_offset: u64,
}
impl<R: Read> Read for SeekerWithOffset<R> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
self.inner.read(buf)
}
}
impl<S: Seek> Seek for SeekerWithOffset<S> {
fn seek(&mut self, pos: std::io::SeekFrom) -> std::io::Result<u64> {
let new_pos = self.inner.seek(pos)?;
if new_pos < self.pos_offset {
return Err(std::io::Error::other("seek position out of bounds"));
}
self.pos = new_pos;
let adjusted_pos = self.pos - self.pos_offset;
Ok(adjusted_pos)
}
}
impl<S> SeekerWithOffset<S> {
pub fn new(inner: S) -> Self {
SeekerWithOffset {
inner,
pos: 0,
pos_offset: 0,
}
}
pub fn mark_offset(&mut self) {
self.pos_offset = self.pos;
}
}