wired 0.5.1

WIP: Collection of embeddable database models for Rust.
Documentation
use super::Backend;
use memmap2::MmapMut;
use serde::{Deserialize, Serialize};
use std::error::Error;
use std::io::Write;
use std::ops::RangeTo;

#[derive(Serialize, Deserialize, Debug, Default)]
pub struct Header {
    pub frame_count: usize,
    pub version: usize,
    pub first_free_frame: usize,
}

impl Header {
    pub fn size() -> usize {
        std::mem::size_of::<Self>()
    }

    pub fn update(&self, mmap: &mut MmapMut) -> Result<(), Box<dyn Error>> {
        let end = Header::size();
        let range = RangeTo { end };
        let bytes: Vec<u8> = bincode::serialize(&self)?;
        (&mut mmap[range]).write_all(&bytes)?;
        Ok(())
    }
}

impl Backend {
    pub fn initialize_header(mapped_file: &mut MmapMut) -> Result<Header, Box<dyn Error>> {
        let end = Header::size();
        let range = RangeTo { end };
        let bytes = &mapped_file[range];
        let mut header: Header = bincode::deserialize_from(bytes)?;
        if header.version == 0 {
            header.version = 1;
            header.update(mapped_file)?;
        }
        Ok(header)
    }
}