bronzedb_protocol/
ext.rs

1use crate::{MAX_KEY_LEN, MAX_VALUE_LEN};
2use bronzedb_util::types::Value;
3use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
4use std::io::{self, Read, Write};
5
6pub trait WriteKVExt: Write {
7    fn write_key(&mut self, key: &[u8]) -> io::Result<usize>;
8    fn write_value(&mut self, key: &[u8]) -> io::Result<usize>;
9}
10
11pub trait ReadKVExt: Read {
12    fn read_key(&mut self) -> io::Result<Vec<u8>>;
13    fn read_value(&mut self) -> io::Result<Value>;
14}
15
16impl<T: Write + ?Sized> WriteKVExt for T {
17    fn write_key(&mut self, key: &[u8]) -> io::Result<usize> {
18        debug_assert!(key.len() <= MAX_KEY_LEN);
19        self.write_u16::<BigEndian>(key.len() as u16)?;
20        self.write_all(key)?;
21        Ok(2 + key.len())
22    }
23
24    fn write_value(&mut self, value: &[u8]) -> io::Result<usize> {
25        debug_assert!(value.len() <= MAX_VALUE_LEN);
26        self.write_u16::<BigEndian>(value.len() as u16)?;
27        self.write_all(value)?;
28        Ok(2 + value.len())
29    }
30}
31
32impl<T: Read + ?Sized> ReadKVExt for T {
33    fn read_key(&mut self) -> io::Result<Vec<u8>> {
34        let key_len = self.read_u16::<BigEndian>()? as usize;
35        debug_assert!(key_len <= MAX_KEY_LEN);
36        let mut key = Vec::with_capacity(key_len);
37        unsafe { key.set_len(key_len) };
38        self.read_exact(key.as_mut_slice())?;
39        Ok(key)
40    }
41
42    fn read_value(&mut self) -> io::Result<Value> {
43        let value_len = self.read_u16::<BigEndian>()? as usize;
44        debug_assert!(value_len <= MAX_VALUE_LEN);
45        let mut value = Vec::with_capacity(value_len);
46        unsafe { value.set_len(value_len) };
47        self.read_exact(value.as_mut_slice())?;
48        Ok(value)
49    }
50}