persistent_kv/
types.rs

1use std::{borrow::Cow, str};
2
3use crate::{Deserializable, Serializable};
4
5impl Serializable for String {
6    const IS_FIXED_SIZE: bool = false;
7    fn serialize(&self) -> Cow<'_, [u8]> {
8        Cow::Borrowed(self.as_bytes())
9    }
10    fn serialize_fixed_size(&self) -> Option<[u8; 8]> {
11        None
12    }
13}
14
15impl Deserializable for String {
16    fn from_bytes(bytes: &[u8]) -> Self {
17        str::from_utf8(bytes).unwrap().to_string()
18    }
19}
20
21impl Serializable for str {
22    const IS_FIXED_SIZE: bool = false;
23    fn serialize(&self) -> Cow<'_, [u8]> {
24        Cow::Borrowed(self.as_bytes())
25    }
26    fn serialize_fixed_size(&self) -> Option<[u8; 8]> {
27        None
28    }
29}
30
31impl Serializable for Vec<u8> {
32    const IS_FIXED_SIZE: bool = false;
33    fn serialize(&self) -> Cow<'_, [u8]> {
34        Cow::Borrowed(self)
35    }
36    fn serialize_fixed_size(&self) -> Option<[u8; 8]> {
37        None
38    }
39}
40
41impl Deserializable for Vec<u8> {
42    fn from_bytes(bytes: &[u8]) -> Self {
43        bytes.to_vec()
44    }
45}
46
47macro_rules! implement_integer_key_type {
48    ($integer_type:ident) => {
49        impl Deserializable for $integer_type {
50            fn from_bytes(bytes: &[u8]) -> Self {
51                let mut buf = [0; std::mem::size_of::<$integer_type>()];
52                buf.copy_from_slice(&bytes[..std::mem::size_of::<$integer_type>()]);
53                $integer_type::from_le_bytes(buf)
54            }
55        }
56
57        impl Serializable for $integer_type {
58            const IS_FIXED_SIZE: bool = true;
59            fn serialize(&self) -> Cow<'_, [u8]> {
60                Cow::Owned(self.to_le_bytes().to_vec())
61            }
62            fn serialize_fixed_size(&self) -> Option<[u8; 8]> {
63                let mut buf = [0; 8];
64                buf[..std::mem::size_of::<$integer_type>()]
65                    .copy_from_slice(&self.to_le_bytes()[..]);
66                Some(buf)
67            }
68        }
69    };
70}
71
72implement_integer_key_type!(u64);
73implement_integer_key_type!(i64);
74implement_integer_key_type!(u32);
75implement_integer_key_type!(i32);
76implement_integer_key_type!(u16);
77implement_integer_key_type!(i16);
78implement_integer_key_type!(u8);
79implement_integer_key_type!(i8);