mdbx_derive_traits/
key.rs1use crate::error::MDBXDeriveError;
2
3pub trait KeyObjectEncode {
4 fn key_encode(&self) -> Result<Vec<u8>, MDBXDeriveError>;
5}
6
7pub trait KeyObjectDecode: Sized {
10 const KEYSIZE: usize = size_of::<Self>();
11 fn key_decode(val: &[u8]) -> Result<Self, MDBXDeriveError>;
12}
13
14impl KeyObjectEncode for &str {
15 fn key_encode(&self) -> Result<Vec<u8>, MDBXDeriveError> {
16 Ok(self.as_bytes().to_vec())
17 }
18}
19
20impl KeyObjectEncode for &[u8] {
21 fn key_encode(&self) -> Result<Vec<u8>, MDBXDeriveError> {
22 Ok(self.to_vec())
23 }
24}
25
26impl KeyObjectEncode for Vec<u8> {
27 fn key_encode(&self) -> Result<Vec<u8>, MDBXDeriveError> {
28 Ok(self.clone())
29 }
30}
31
32impl<const N: usize> KeyObjectEncode for [u8; N] {
33 fn key_encode(&self) -> Result<Vec<u8>, MDBXDeriveError> {
34 Ok(self.to_vec())
35 }
36}
37
38impl<const N: usize> KeyObjectDecode for [u8; N] {
39 const KEYSIZE: usize = N;
40 fn key_decode(val: &[u8]) -> Result<Self, MDBXDeriveError> {
41 val.try_into().map_err(|_| MDBXDeriveError::Corrupted)
42 }
43}
44
45impl KeyObjectDecode for () {
46 const KEYSIZE: usize = 0;
47 fn key_decode(val: &[u8]) -> Result<Self, MDBXDeriveError> {
48 if val.is_empty() {
49 Ok(())
50 } else {
51 Err(MDBXDeriveError::IncorrectSchema(val.to_vec()))
52 }
53 }
54}
55
56impl KeyObjectEncode for () {
57 fn key_encode(&self) -> Result<Vec<u8>, MDBXDeriveError> {
58 Ok(vec![])
59 }
60}
61
62macro_rules! impl_ints {
63 ( $( $name:ident )+ ) => {
64 $(
65 impl KeyObjectEncode for $name {
66 fn key_encode(&self) -> Result<Vec<u8>, MDBXDeriveError> {
67 Ok(self.to_be_bytes().into_iter().collect())
68 }
69 }
70
71 impl KeyObjectDecode for $name {
72 fn key_decode(val: &[u8]) -> Result<Self, MDBXDeriveError> {
73 Ok($name::from_be_bytes(val.try_into().map_err(|_| MDBXDeriveError::Corrupted)?))
74 }
75 }
76 )+
77 };
78}
79
80impl_ints! { u8 u16 u32 u64 i8 i16 i32 i64 }
81
82macro_rules! tuple_impls {
83 ( $( $name:ident )+ ) => {
84 impl<$($name: KeyObjectEncode),+> KeyObjectEncode for ($(&$name,)+)
85 {
86 fn key_encode(&self) -> Result<Vec<u8>, MDBXDeriveError> {
87 let ($($name,)+) = self;
88 Ok( std::iter::empty()$(.chain($name.key_encode()?.into_iter()))*.collect() )
89 }
90 }
91 };
92}
93
94tuple_impls! { A }
95tuple_impls! { A B }
96tuple_impls! { A B C }
97tuple_impls! { A B C D }
98tuple_impls! { A B C D E }
99tuple_impls! { A B C D E F }
100tuple_impls! { A B C D E F G }
101tuple_impls! { A B C D E F G H }
102tuple_impls! { A B C D E F G H I }
103tuple_impls! { A B C D E F G H I J }
104tuple_impls! { A B C D E F G H I J K }
105tuple_impls! { A B C D E F G H I J K L }