novakv 1.0.1

An embedded, ordered key-value store for Rust.
Documentation
use crate::status::{Result, Status};

#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct LogRecordHeader {
    pub crc: u32,
    pub length: u16,
    pub kind: u8,
}

impl LogRecordHeader {
    pub const SIZE: usize = 7;
    pub const KIND_ZERO: u8 = 0;
    pub const KIND_FULL: u8 = 1;
    pub const KIND_FIRST: u8 = 2;
    pub const KIND_MIDDLE: u8 = 3;
    pub const KIND_LAST: u8 = 4;

    pub fn encode(&self, dst: &mut Vec<u8>) {
        crate::coding::put_fixed32(dst, crate::crc32c::mask(self.crc));
        crate::coding::put_fixed16(dst, self.length);
        dst.push(self.kind);
    }

    pub fn decode_from(input: &mut &[u8]) -> Result<Self> {
        let crc_raw = crate::coding::get_fixed32(input)
            .ok_or_else(|| Status::corruption("LogRecordHeader: missing crc"))?;
        let crc = crate::crc32c::unmask(crc_raw);
        let length = crate::coding::get_fixed16(input)
            .ok_or_else(|| Status::corruption("LogRecordHeader: missing length"))?;
        let kind = crate::coding::get_u8(input)
            .ok_or_else(|| Status::corruption("LogRecordHeader: missing kind"))?;
        Ok(Self { crc, length, kind })
    }
}