use std::io::{
Result,
Seek,
SeekFrom,
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)
}
}