redb_bincode/
readable_table.rs

1use std::borrow::Borrow;
2use std::{fmt, ops};
3
4use redb::StorageError;
5
6type Result<T = (), E = StorageError> = std::result::Result<T, E>;
7
8use crate::{AccessGuard, Lexicographical, Range, ReadOnlyTable, SortKey, SortOrder, Table};
9
10pub trait ReadableTable<K, V, S = Lexicographical>
11where
12    S: SortOrder + fmt::Debug + 'static,
13    K: bincode::Encode + bincode::Decode<()>,
14    V: bincode::Encode + bincode::Decode<()>,
15{
16    #[allow(clippy::type_complexity)]
17    fn first(
18        &self,
19    ) -> Result<Option<(AccessGuard<'_, K, SortKey<S>>, AccessGuard<'_, V>)>, StorageError>;
20
21    #[allow(clippy::type_complexity)]
22    fn last(
23        &self,
24    ) -> Result<Option<(AccessGuard<'_, K, SortKey<S>>, AccessGuard<'_, V>)>, StorageError>;
25
26    fn range<'a, Q>(
27        &self,
28        range: impl ops::RangeBounds<Q> + 'a,
29    ) -> Result<Range<'_, K, V, SortKey<S>>, StorageError>
30    where
31        K: Borrow<Q>,
32        Q: bincode::Encode + ?Sized;
33
34    fn get<Q>(&self, key: &Q) -> Result<Option<AccessGuard<'_, V>>, StorageError>
35    where
36        K: Borrow<Q>,
37        Q: bincode::Encode + ?Sized;
38}
39
40impl<K, V, S> ReadableTable<K, V, S> for ReadOnlyTable<K, V, S>
41where
42    S: SortOrder + fmt::Debug + 'static,
43    K: bincode::Encode + bincode::Decode<()>,
44    V: bincode::Encode + bincode::Decode<()>,
45{
46    #[allow(clippy::type_complexity)]
47    fn first(
48        &self,
49    ) -> Result<Option<(AccessGuard<'_, K, SortKey<S>>, AccessGuard<'_, V>)>, StorageError> {
50        self.first()
51    }
52
53    #[allow(clippy::type_complexity)]
54    fn last(
55        &self,
56    ) -> Result<Option<(AccessGuard<'_, K, SortKey<S>>, AccessGuard<'_, V>)>, StorageError> {
57        self.last()
58    }
59
60    fn range<'a, Q>(
61        &self,
62        range: impl ops::RangeBounds<Q> + 'a,
63    ) -> Result<Range<'_, K, V, SortKey<S>>, StorageError>
64    where
65        K: Borrow<Q>,
66        Q: bincode::Encode + ?Sized,
67    {
68        self.range(range)
69    }
70
71    fn get<Q>(&self, key: &Q) -> Result<Option<AccessGuard<'_, V>>, StorageError>
72    where
73        K: Borrow<Q>,
74        Q: bincode::Encode + ?Sized,
75    {
76        self.get(key)
77    }
78}
79
80impl<K, V, S> ReadableTable<K, V, S> for Table<'_, K, V, S>
81where
82    S: SortOrder + fmt::Debug + 'static,
83    K: bincode::Encode + bincode::Decode<()>,
84    V: bincode::Encode + bincode::Decode<()>,
85{
86    #[allow(clippy::type_complexity)]
87    fn first(
88        &self,
89    ) -> Result<Option<(AccessGuard<'_, K, SortKey<S>>, AccessGuard<'_, V>)>, StorageError> {
90        self.first()
91    }
92
93    #[allow(clippy::type_complexity)]
94    fn last(
95        &self,
96    ) -> Result<Option<(AccessGuard<'_, K, SortKey<S>>, AccessGuard<'_, V>)>, StorageError> {
97        self.last()
98    }
99
100    fn range<'a, Q>(
101        &self,
102        range: impl ops::RangeBounds<Q> + 'a,
103    ) -> Result<Range<'_, K, V, SortKey<S>>, StorageError>
104    where
105        K: Borrow<Q>,
106        Q: bincode::Encode + ?Sized,
107    {
108        self.range(range)
109    }
110
111    fn get<Q>(&self, key: &Q) -> Result<Option<AccessGuard<'_, V>>, StorageError>
112    where
113        K: Borrow<Q>,
114        Q: bincode::Encode + ?Sized,
115    {
116        self.get(key)
117    }
118}