#[derive(Debug, Clone, Copy)]
pub enum WriteError {
NotEnoughSpace,
TryFromIntError,
}
pub trait Write: Sized {
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError>;
}
impl Write for f32 {
#[inline]
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError> {
self.to_bits().write(bytes, pos)
}
}
impl Write for f64 {
#[inline]
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError> {
self.to_bits().write(bytes, pos)
}
}
impl Write for bool {
#[inline]
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError> {
let value: u8 = if *self { 1 } else { 0 };
value.write(bytes, pos)
}
}
impl Write for usize {
#[inline]
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError> {
(*self as u8).write(bytes, pos)
}
}
impl<T> Write for Option<T>
where
T: Write + Default,
{
#[inline]
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError> {
self.is_some().write(bytes, pos)?;
match self {
Some(item) => item.write(bytes, pos)?,
None => T::default().write(bytes, pos)?,
};
Ok(())
}
}
impl<'a, T> Write for &'a [T]
where
T: Write,
{
#[inline]
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError> {
self.len().write(bytes, pos)?;
for item in self.iter() {
item.write(bytes, pos)?;
}
Ok(())
}
}
impl<T> Write for Vec<T>
where
T: Write,
{
#[inline]
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError> {
self.len().write(bytes, pos)?;
for item in self.iter() {
item.write(bytes, pos)?;
}
Ok(())
}
}
impl Write for String {
#[inline]
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError> {
self.as_bytes().write(bytes, pos)
}
}
impl<'a> Write for &'a str {
#[inline]
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError> {
self.as_bytes().write(bytes, pos)
}
}
impl<A, B> Write for (A, B)
where
A: Write,
B: Write,
{
#[inline]
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError> {
self.0.write(bytes, pos)?;
self.1.write(bytes, pos)?;
Ok(())
}
}
impl<A, B, C> Write for (A, B, C)
where
A: Write,
B: Write,
C: Write,
{
#[inline]
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError> {
self.0.write(bytes, pos)?;
self.1.write(bytes, pos)?;
self.2.write(bytes, pos)?;
Ok(())
}
}
impl<A, B, C, D> Write for (A, B, C, D)
where
A: Write,
B: Write,
C: Write,
D: Write,
{
#[inline]
fn write(
&self,
bytes: &mut [u8],
pos: &mut usize,
) -> Result<(), WriteError> {
self.0.write(bytes, pos)?;
self.1.write(bytes, pos)?;
self.2.write(bytes, pos)?;
self.3.write(bytes, pos)?;
Ok(())
}
}