bronzedb-protocol 0.1.0

protocol for bronzedb
Documentation
use crate::{MAX_KEY_LEN, MAX_VALUE_LEN};
use bronzedb_util::types::Value;
use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
use std::io::{self, Read, Write};

pub trait WriteKVExt: Write {
    fn write_key(&mut self, key: &[u8]) -> io::Result<usize>;
    fn write_value(&mut self, key: &[u8]) -> io::Result<usize>;
}

pub trait ReadKVExt: Read {
    fn read_key(&mut self) -> io::Result<Vec<u8>>;
    fn read_value(&mut self) -> io::Result<Value>;
}

impl<T: Write + ?Sized> WriteKVExt for T {
    fn write_key(&mut self, key: &[u8]) -> io::Result<usize> {
        debug_assert!(key.len() <= MAX_KEY_LEN);
        self.write_u16::<BigEndian>(key.len() as u16)?;
        self.write_all(key)?;
        Ok(2 + key.len())
    }

    fn write_value(&mut self, value: &[u8]) -> io::Result<usize> {
        debug_assert!(value.len() <= MAX_VALUE_LEN);
        self.write_u16::<BigEndian>(value.len() as u16)?;
        self.write_all(value)?;
        Ok(2 + value.len())
    }
}

impl<T: Read + ?Sized> ReadKVExt for T {
    fn read_key(&mut self) -> io::Result<Vec<u8>> {
        let key_len = self.read_u16::<BigEndian>()? as usize;
        debug_assert!(key_len <= MAX_KEY_LEN);
        let mut key = Vec::with_capacity(key_len);
        unsafe { key.set_len(key_len) };
        self.read_exact(key.as_mut_slice())?;
        Ok(key)
    }

    fn read_value(&mut self) -> io::Result<Value> {
        let value_len = self.read_u16::<BigEndian>()? as usize;
        debug_assert!(value_len <= MAX_VALUE_LEN);
        let mut value = Vec::with_capacity(value_len);
        unsafe { value.set_len(value_len) };
        self.read_exact(value.as_mut_slice())?;
        Ok(value)
    }
}