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}