Skip to main content

mdbx_derive_traits/
key.rs

1use crate::error::MDBXDeriveError;
2
3pub trait KeyObjectEncode {
4    fn key_encode(&self) -> Result<Vec<u8>, MDBXDeriveError>;
5}
6
7// https://github.com/rust-lang/rust/issues/60551
8// Not stablized yet, so we can't have key_decode(val: [u8; Self::KEYSIZE])
9pub 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 }