use std::io::Result;
use std::io::Seek;
use std::io::SeekFrom;
use std::io::Write;
use crate::std_io::WriteSeek;
pub trait WriteSeekExt: Write + Seek {
fn write_all_at_preserving_position(&mut self, offset: u64, buffer: &[u8]) -> Result<()>;
}
fn write_all_at_preserving_position_impl(output: &mut dyn WriteSeek, offset: u64, buffer: &[u8]) -> Result<()> {
let position = output.stream_position()?;
let write_result = match output.seek(SeekFrom::Start(offset)) {
Ok(_) => output.write_all(buffer),
Err(error) => Err(error),
};
let restore_result = output.seek(SeekFrom::Start(position));
match (write_result, restore_result) {
(Ok(()), Ok(_)) => Ok(()),
(Err(error), Ok(_)) => Err(error),
(_, Err(error)) => Err(error),
}
}
impl<T> WriteSeekExt for T
where
T: Write + Seek + ?Sized,
{
#[inline(always)]
fn write_all_at_preserving_position(&mut self, offset: u64, buffer: &[u8]) -> Result<()> {
let mut output = self;
write_all_at_preserving_position_impl(&mut output, offset, buffer)
}
}