float_pigment_consistent_bincode/
io.rsuse alloc::vec::Vec;
use byteorder::ByteOrder;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Error {
kind: ErrorKind,
}
impl Error {
pub fn new(kind: ErrorKind) -> Self {
Self { kind }
}
pub fn kind(&self) -> ErrorKind {
self.kind
}
fn is_interrupted(&self) -> bool {
match self.kind {
ErrorKind::Unknown => false,
ErrorKind::UnexpectedEof => true,
}
}
}
impl core::fmt::Display for Error {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(match self.kind {
ErrorKind::Unknown => "I/O Error",
ErrorKind::UnexpectedEof => "Unexpected EOF",
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ErrorKind {
Unknown,
UnexpectedEof,
}
impl From<ErrorKind> for Error {
fn from(kind: ErrorKind) -> Self {
Self { kind }
}
}
impl serde::de::StdError for Error {}
pub type Result<T> = core::result::Result<T, Error>;
pub trait Read {
fn read(&mut self, buf: &mut [u8]) -> Result<usize>;
fn read_exact(&mut self, mut buf: &mut [u8]) -> Result<()> {
while !buf.is_empty() {
match self.read(buf) {
Ok(0) => break,
Ok(n) => {
buf = &mut buf[n..];
}
Err(ref e) if e.is_interrupted() => {}
Err(e) => return Err(e),
}
}
if !buf.is_empty() {
Err(Error::new(ErrorKind::UnexpectedEof))
} else {
Ok(())
}
}
fn read_u8(&mut self) -> Result<u8> {
let mut buf = [0; 1];
self.read_exact(&mut buf)?;
Ok(buf[0])
}
fn read_u16<T: ByteOrder + 'static>(&mut self) -> Result<u16> {
let mut buf = [0; 2];
self.read_exact(&mut buf)?;
Ok(T::read_u16(&buf))
}
fn read_u32<T: ByteOrder + 'static>(&mut self) -> Result<u32> {
let mut buf = [0; 4];
self.read_exact(&mut buf)?;
Ok(T::read_u32(&buf))
}
fn read_u64<T: ByteOrder + 'static>(&mut self) -> Result<u64> {
let mut buf = [0; 8];
self.read_exact(&mut buf)?;
Ok(T::read_u64(&buf))
}
fn read_u128<T: ByteOrder + 'static>(&mut self) -> Result<u128> {
let mut buf = [0; 16];
self.read_exact(&mut buf)?;
Ok(T::read_u128(&buf))
}
fn read_f32<T: ByteOrder + 'static>(&mut self) -> Result<f32> {
let mut buf = [0; 4];
self.read_exact(&mut buf)?;
Ok(T::read_f32(&buf))
}
fn read_f64<T: ByteOrder + 'static>(&mut self) -> Result<f64> {
let mut buf = [0; 8];
self.read_exact(&mut buf)?;
Ok(T::read_f64(&buf))
}
}
impl Read for &[u8] {
#[inline]
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
let amt = core::cmp::min(buf.len(), self.len());
let (a, b) = self.split_at(amt);
if amt == 1 {
buf[0] = a[0];
} else {
buf[..amt].copy_from_slice(a);
}
*self = b;
Ok(amt)
}
}
impl<R: Read + ?Sized> Read for &mut R {
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
(**self).read(buf)
}
}
pub trait Write {
fn write(&mut self, buf: &[u8]) -> Result<usize>;
fn write_all(&mut self, mut buf: &[u8]) -> Result<()> {
while !buf.is_empty() {
match self.write(buf) {
Ok(0) => {
return Err(ErrorKind::Unknown.into());
}
Ok(n) => buf = &buf[n..],
Err(ref e) if e.is_interrupted() => {}
Err(e) => return Err(e),
}
}
Ok(())
}
fn write_u8(&mut self, n: u8) -> Result<()> {
self.write_all(&[n])
}
fn write_u16<T: ByteOrder + 'static>(&mut self, n: u16) -> Result<()> {
let mut buf = [0; 2];
T::write_u16(&mut buf, n);
self.write_all(&buf)
}
fn write_u32<T: ByteOrder + 'static>(&mut self, n: u32) -> Result<()> {
let mut buf = [0; 4];
T::write_u32(&mut buf, n);
self.write_all(&buf)
}
fn write_u64<T: ByteOrder + 'static>(&mut self, n: u64) -> Result<()> {
let mut buf = [0; 8];
T::write_u64(&mut buf, n);
self.write_all(&buf)
}
fn write_u128<T: ByteOrder + 'static>(&mut self, n: u128) -> Result<()> {
let mut buf = [0; 16];
T::write_u128(&mut buf, n);
self.write_all(&buf)
}
fn write_f32<T: ByteOrder + 'static>(&mut self, n: f32) -> Result<()> {
let mut buf = [0; 4];
T::write_f32(&mut buf, n);
self.write_all(&buf)
}
fn write_f64<T: ByteOrder + 'static>(&mut self, n: f64) -> Result<()> {
let mut buf = [0; 8];
T::write_f64(&mut buf, n);
self.write_all(&buf)
}
}
impl Write for &mut Vec<u8> {
fn write(&mut self, buf: &[u8]) -> Result<usize> {
self.extend(buf.iter());
Ok(buf.len())
}
}