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 FileMetaData {
    pub number: u64,
    pub file_size: u64,
    pub smallest: Vec<u8>,
    pub largest: Vec<u8>,
}

impl FileMetaData {
    pub fn encode(&self, dst: &mut Vec<u8>) {
        crate::coding::put_varint64(dst, self.number);
        crate::coding::put_varint64(dst, self.file_size);
        crate::coding::put_length_prefixed_slice(dst, &self.smallest);
        crate::coding::put_length_prefixed_slice(dst, &self.largest);
    }

    pub fn decode_from(input: &mut &[u8]) -> Result<Self> {
        let number = crate::coding::get_varint64(input)
            .ok_or_else(|| Status::corruption("FileMetaData: missing number"))?;
        let file_size = crate::coding::get_varint64(input)
            .ok_or_else(|| Status::corruption("FileMetaData: missing file_size"))?;
        let smallest = crate::coding::get_length_prefixed_slice(input)
            .map(<[u8]>::to_vec)
            .ok_or_else(|| Status::corruption("FileMetaData: missing smallest"))?;
        let largest = crate::coding::get_length_prefixed_slice(input)
            .map(<[u8]>::to_vec)
            .ok_or_else(|| Status::corruption("FileMetaData: missing largest"))?;
        Ok(Self {
            number,
            file_size,
            smallest,
            largest,
        })
    }

    pub fn encode_streaming(
        dst: &mut Vec<u8>,
        number: u64,
        file_size: u64,
        smallest: &[u8],
        largest: &[u8],
    ) {
        crate::coding::put_varint64(dst, number);
        crate::coding::put_varint64(dst, file_size);
        crate::coding::put_length_prefixed_slice(dst, smallest);
        crate::coding::put_length_prefixed_slice(dst, largest);
    }

    pub fn visit<F, R>(input: &mut &[u8], f: F) -> Result<R>
    where
        F: FnOnce(u64, u64, &[u8], &[u8]) -> R,
    {
        let number = crate::coding::get_varint64(input)
            .ok_or_else(|| Status::corruption("FileMetaData: missing number"))?;
        let file_size = crate::coding::get_varint64(input)
            .ok_or_else(|| Status::corruption("FileMetaData: missing file_size"))?;
        let smallest = crate::coding::get_length_prefixed_slice(input)
            .ok_or_else(|| Status::corruption("FileMetaData: missing smallest"))?;
        let largest = crate::coding::get_length_prefixed_slice(input)
            .ok_or_else(|| Status::corruption("FileMetaData: missing largest"))?;
        Ok(f(number, file_size, smallest, largest))
    }
}