1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Error propagation
use anyhow::{Result, bail as error_msg};

// Endian type
#[cfg(target_endian = "little")]
type EndianType = byteorder::LittleEndian;
#[cfg(target_endian = "big")]
type EndianType = byteorder::BigEndian;

// Read & Write extension
use byteorder::{ReadBytesExt, WriteBytesExt};

// Main trait
use std::io::{Write, Read};

pub trait Saveable {
    fn save_to<W>(&self, writer: W) -> Result<()> where
        W: Write;
    fn size_of(&self) -> usize;
}

pub trait Loadable {
    fn load_from<R>(reader: R) -> Result<Self> where
        R: Read,
        Self: Sized;
}

// Implementations
mod implementation;