use crate::error::Result;
use std::io::{Read, Write};
pub trait FromBinary: Sized {
fn read_from<R: Read>(reader: &mut R) -> Result<Self>;
fn read_from_preserving<R: Read>(
reader: &mut R,
_block_size: usize,
) -> Result<(Self, Vec<u8>)> {
let value = Self::read_from(reader)?;
Ok((value, Vec::new()))
}
}
pub trait ToBinary {
fn write_to<W: Write>(&self, writer: &mut W) -> Result<()>;
fn binary_size(&self) -> usize;
}
impl FromBinary for i8 {
fn read_from<R: Read>(reader: &mut R) -> Result<Self> {
use byteorder::ReadBytesExt;
Ok(reader.read_i8()?)
}
}
impl ToBinary for i8 {
fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> {
use byteorder::WriteBytesExt;
writer.write_i8(*self)?;
Ok(())
}
fn binary_size(&self) -> usize {
1
}
}
impl FromBinary for u8 {
fn read_from<R: Read>(reader: &mut R) -> Result<Self> {
use byteorder::ReadBytesExt;
Ok(reader.read_u8()?)
}
}
impl ToBinary for u8 {
fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> {
use byteorder::WriteBytesExt;
writer.write_u8(*self)?;
Ok(())
}
fn binary_size(&self) -> usize {
1
}
}
impl FromBinary for i16 {
fn read_from<R: Read>(reader: &mut R) -> Result<Self> {
use byteorder::{LittleEndian, ReadBytesExt};
Ok(reader.read_i16::<LittleEndian>()?)
}
}
impl ToBinary for i16 {
fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> {
use byteorder::{LittleEndian, WriteBytesExt};
writer.write_i16::<LittleEndian>(*self)?;
Ok(())
}
fn binary_size(&self) -> usize {
2
}
}
impl FromBinary for u16 {
fn read_from<R: Read>(reader: &mut R) -> Result<Self> {
use byteorder::{LittleEndian, ReadBytesExt};
Ok(reader.read_u16::<LittleEndian>()?)
}
}
impl ToBinary for u16 {
fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> {
use byteorder::{LittleEndian, WriteBytesExt};
writer.write_u16::<LittleEndian>(*self)?;
Ok(())
}
fn binary_size(&self) -> usize {
2
}
}
impl FromBinary for i32 {
fn read_from<R: Read>(reader: &mut R) -> Result<Self> {
use byteorder::{LittleEndian, ReadBytesExt};
Ok(reader.read_i32::<LittleEndian>()?)
}
}
impl ToBinary for i32 {
fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> {
use byteorder::{LittleEndian, WriteBytesExt};
writer.write_i32::<LittleEndian>(*self)?;
Ok(())
}
fn binary_size(&self) -> usize {
4
}
}
impl FromBinary for u32 {
fn read_from<R: Read>(reader: &mut R) -> Result<Self> {
use byteorder::{LittleEndian, ReadBytesExt};
Ok(reader.read_u32::<LittleEndian>()?)
}
}
impl ToBinary for u32 {
fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> {
use byteorder::{LittleEndian, WriteBytesExt};
writer.write_u32::<LittleEndian>(*self)?;
Ok(())
}
fn binary_size(&self) -> usize {
4
}
}
impl FromBinary for i64 {
fn read_from<R: Read>(reader: &mut R) -> Result<Self> {
use byteorder::{LittleEndian, ReadBytesExt};
Ok(reader.read_i64::<LittleEndian>()?)
}
}
impl ToBinary for i64 {
fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> {
use byteorder::{LittleEndian, WriteBytesExt};
writer.write_i64::<LittleEndian>(*self)?;
Ok(())
}
fn binary_size(&self) -> usize {
8
}
}
impl FromBinary for u64 {
fn read_from<R: Read>(reader: &mut R) -> Result<Self> {
use byteorder::{LittleEndian, ReadBytesExt};
Ok(reader.read_u64::<LittleEndian>()?)
}
}
impl ToBinary for u64 {
fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> {
use byteorder::{LittleEndian, WriteBytesExt};
writer.write_u64::<LittleEndian>(*self)?;
Ok(())
}
fn binary_size(&self) -> usize {
8
}
}
impl FromBinary for f32 {
fn read_from<R: Read>(reader: &mut R) -> Result<Self> {
use byteorder::{LittleEndian, ReadBytesExt};
Ok(reader.read_f32::<LittleEndian>()?)
}
}
impl ToBinary for f32 {
fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> {
use byteorder::{LittleEndian, WriteBytesExt};
writer.write_f32::<LittleEndian>(*self)?;
Ok(())
}
fn binary_size(&self) -> usize {
4
}
}
impl FromBinary for f64 {
fn read_from<R: Read>(reader: &mut R) -> Result<Self> {
use byteorder::{LittleEndian, ReadBytesExt};
Ok(reader.read_f64::<LittleEndian>()?)
}
}
impl ToBinary for f64 {
fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> {
use byteorder::{LittleEndian, WriteBytesExt};
writer.write_f64::<LittleEndian>(*self)?;
Ok(())
}
fn binary_size(&self) -> usize {
8
}
}
impl FromBinary for bool {
fn read_from<R: Read>(reader: &mut R) -> Result<Self> {
use byteorder::ReadBytesExt;
Ok(reader.read_u8()? != 0)
}
}
impl ToBinary for bool {
fn write_to<W: Write>(&self, writer: &mut W) -> Result<()> {
use byteorder::WriteBytesExt;
writer.write_u8(if *self { 1 } else { 0 })?;
Ok(())
}
fn binary_size(&self) -> usize {
1
}
}