Skip to main content

tuwunel_database/
keyval.rs

1use serde::{Deserialize, Serialize};
2use tuwunel_core::{Result, smallvec::SmallVec};
3
4use crate::{de, ser};
5
6pub type KeyVal<'a, K = &'a Slice, V = &'a Slice> = (Key<'a, K>, Val<'a, V>);
7pub type Key<'a, T = &'a Slice> = T;
8pub type Val<'a, T = &'a Slice> = T;
9
10pub type KeyBuf = KeyBuffer;
11pub type ValBuf = ValBuffer;
12
13pub type KeyBuffer<const CAP: usize = KEY_STACK_CAP> = Buffer<CAP>;
14pub type ValBuffer<const CAP: usize = VAL_STACK_CAP> = Buffer<CAP>;
15pub type Buffer<const CAP: usize = DEF_STACK_CAP> = SmallVec<[Byte; CAP]>;
16
17pub type Slice = [Byte];
18pub type Byte = u8;
19
20pub const KEY_STACK_CAP: usize = 128 - 16;
21pub const VAL_STACK_CAP: usize = 512 - 16;
22pub const DEF_STACK_CAP: usize = KEY_STACK_CAP;
23
24#[inline]
25pub fn serialize_key<T>(val: T) -> Result<KeyBuf>
26where
27	T: Serialize,
28{
29	ser::serialize_to::<KeyBuf, _>(val)
30}
31
32#[inline]
33pub fn serialize_val<T>(val: T) -> Result<ValBuf>
34where
35	T: Serialize,
36{
37	ser::serialize_to::<ValBuf, _>(val)
38}
39
40#[inline]
41pub(crate) fn _expect_deserialize<'a, K, V>(kv: Result<KeyVal<'a>>) -> KeyVal<'a, K, V>
42where
43	K: Deserialize<'a>,
44	V: Deserialize<'a>,
45{
46	result_deserialize(kv).expect("failed to deserialize result key/val")
47}
48
49#[inline]
50pub(crate) fn _expect_deserialize_key<'a, K>(key: Result<Key<'a>>) -> Key<'a, K>
51where
52	K: Deserialize<'a>,
53{
54	result_deserialize_key(key).expect("failed to deserialize result key")
55}
56
57#[inline]
58pub(crate) fn result_deserialize<'a, K, V>(kv: Result<KeyVal<'a>>) -> Result<KeyVal<'a, K, V>>
59where
60	K: Deserialize<'a>,
61	V: Deserialize<'a>,
62{
63	deserialize(kv?)
64}
65
66#[inline]
67pub(crate) fn result_deserialize_key<'a, K>(key: Result<Key<'a>>) -> Result<Key<'a, K>>
68where
69	K: Deserialize<'a>,
70{
71	deserialize_key(key?)
72}
73
74#[inline]
75pub(crate) fn deserialize<'a, K, V>(kv: KeyVal<'a>) -> Result<KeyVal<'a, K, V>>
76where
77	K: Deserialize<'a>,
78	V: Deserialize<'a>,
79{
80	Ok((deserialize_key::<K>(kv.0)?, deserialize_val::<V>(kv.1)?))
81}
82
83#[inline]
84pub(crate) fn deserialize_key<'a, K>(key: Key<'a>) -> Result<Key<'a, K>>
85where
86	K: Deserialize<'a>,
87{
88	de::from_slice::<K>(key)
89}
90
91#[inline]
92pub(crate) fn deserialize_val<'a, V>(val: Val<'a>) -> Result<Val<'a, V>>
93where
94	V: Deserialize<'a>,
95{
96	de::from_slice::<V>(val)
97}
98
99#[inline]
100pub fn key<K, V>(kv: KeyVal<'_, K, V>) -> Key<'_, K> { kv.0 }
101
102#[inline]
103pub fn val<K, V>(kv: KeyVal<'_, K, V>) -> Val<'_, V> { kv.1 }