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);