redb_bincode/
access_guard.rs

1use std::fmt;
2use std::marker::PhantomData;
3
4use crate::{SortKey, SortOrder, BINCODE_CONFIG};
5
6pub struct AccessGuard<'a, V, IV = &'static [u8]>
7where
8    IV: redb::Value + 'static,
9{
10    inner: redb::AccessGuard<'a, IV>,
11    _v: PhantomData<V>,
12}
13
14impl<'a, V> From<redb::AccessGuard<'a, &'static [u8]>> for AccessGuard<'a, V> {
15    fn from(inner: redb::AccessGuard<'a, &'static [u8]>) -> Self {
16        Self {
17            inner,
18            _v: PhantomData,
19        }
20    }
21}
22
23impl<'a, S, V> From<redb::AccessGuard<'a, SortKey<S>>> for AccessGuard<'a, V, SortKey<S>>
24where
25    S: SortOrder + fmt::Debug,
26{
27    fn from(inner: redb::AccessGuard<'a, SortKey<S>>) -> Self {
28        Self {
29            inner,
30            _v: PhantomData,
31        }
32    }
33}
34
35impl<V> AccessGuard<'_, V>
36where
37    V: bincode::Decode<()>,
38{
39    pub fn value(&self) -> V {
40        self.value_try().expect("Invalid encoding")
41    }
42
43    pub fn value_try(&self) -> Result<V, bincode::error::DecodeError> {
44        bincode::decode_from_slice(self.inner.value(), BINCODE_CONFIG).map(|v| v.0)
45    }
46}
47
48impl<V, S> AccessGuard<'_, V, SortKey<S>>
49where
50    V: bincode::Decode<()>,
51    S: SortOrder + fmt::Debug,
52{
53    pub fn value(&self) -> V {
54        self.value_try().expect("Invalid encoding")
55    }
56
57    pub fn value_try(&self) -> Result<V, bincode::error::DecodeError> {
58        bincode::decode_from_slice(self.inner.value(), BINCODE_CONFIG).map(|v| v.0)
59    }
60}