use crate::Error;
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum SeekFrom {
Start(u64),
End(i64),
Current(i64),
}
cfg_feature_std! {
impl From<SeekFrom> for std::io::SeekFrom {
fn from(fr: SeekFrom) -> Self {
match fr {
SeekFrom::Start(n) => std::io::SeekFrom::Start(n),
SeekFrom::End(n) => std::io::SeekFrom::End(n),
SeekFrom::Current(n) => std::io::SeekFrom::Current(n),
}
}
}
}
pub trait Seek {
fn seek(&mut self, pos: SeekFrom) -> Result<u64, Error>;
}
pub trait SeekRead {
fn seek_read(&mut self, out: &mut [u8], offset: u64) -> Result<usize, Error>;
fn seek_read_all(&mut self, mut out: &mut [u8], mut offset: u64) -> Result<(), Error> {
while !out.is_empty() {
let split = self.seek_read(out, offset)?;
let (_, newo) = out.split_at_mut(split);
out = newo;
offset += split as u64;
}
Ok(())
}
}
pub trait SeekWrite {
fn seek_write(&mut self, input: &[u8], offset: u64) -> Result<usize, Error>;
fn seek_write_all(&mut self, mut input: &[u8], mut offset: u64) -> Result<(), Error> {
while !input.is_empty() {
let split = self.seek_write(input, offset)?;
let (_, nxt) = input.split_at(split);
offset += split as u64;
input = nxt;
}
Ok(())
}
}