use crate::Result;
mod impls;
#[derive(Copy, PartialEq, Eq, Clone, Debug)]
pub enum SeekFrom {
Start(u64),
End(i64),
Current(i64),
}
pub fn default_stream_len<T: Seek + ?Sized>(this: &mut T) -> Result<u64> {
let old_pos = this.stream_position()?;
let len = this.seek(SeekFrom::End(0))?;
if old_pos != len {
this.seek(SeekFrom::Start(old_pos))?;
}
Ok(len)
}
pub trait Seek {
fn seek(&mut self, pos: SeekFrom) -> Result<u64>;
fn rewind(&mut self) -> Result<()> {
self.seek(SeekFrom::Start(0))?;
Ok(())
}
fn stream_position(&mut self) -> Result<u64> {
self.seek(SeekFrom::Current(0))
}
fn stream_len(&mut self) -> Result<u64> {
default_stream_len(self)
}
fn seek_relative(&mut self, offset: i64) -> Result<()> {
self.seek(SeekFrom::Current(offset))?;
Ok(())
}
}