redb_bincode/
access_guard.rs1use 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}