use std::io::{
Result,
Seek,
SeekFrom,
};
pub trait SeekExt: Seek {
fn stream_size(&mut self) -> Result<u64>;
}
impl<T> SeekExt for T
where
T: Seek + ?Sized,
{
#[inline]
fn stream_size(&mut self) -> Result<u64> {
let mut stream = self;
stream_size_impl(&mut stream)
}
}
fn stream_size_impl(stream: &mut dyn Seek) -> Result<u64> {
let position = stream.stream_position()?;
let size_result = stream.seek(SeekFrom::End(0));
let restore_result = stream.seek(SeekFrom::Start(position));
match (size_result, restore_result) {
(Ok(size), Ok(_)) => Ok(size),
(Err(error), Ok(_)) => Err(error),
(_, Err(error)) => Err(error),
}
}