1use serde::{de::DeserializeOwned, Serialize};
4use std::{borrow::Borrow, collections::BTreeMap, error::Error};
5
6pub trait Map<'a, K, V>
7where
8 K: Serialize + DeserializeOwned + ?Sized,
9 V: Serialize + DeserializeOwned,
10{
11 type Error: Error;
12 type Iterator: Iterator<Item = (K, V)>;
13 type Keys: Iterator<Item = K>;
14 type Values: Iterator<Item = V>;
15
16 fn contains_key(&self, key: &K) -> Result<bool, Self::Error>;
18
19 fn get(&self, key: &K) -> Result<Option<V>, Self::Error>;
21
22 fn get_raw_bytes(&self, key: &K) -> Result<Option<Vec<u8>>, Self::Error>;
24
25 fn get_or_insert_unsafe<F: FnOnce() -> V>(
29 &self,
30 key: &K,
31 default: F,
32 ) -> Result<V, Self::Error> {
33 self.get(key).and_then(|optv| match optv {
34 Some(v) => Ok(v),
35 None => {
36 self.insert(key, &default())?;
37 self.get(key).transpose().expect("default just inserted")
38 }
39 })
40 }
41
42 fn insert(&self, key: &K, value: &V) -> Result<(), Self::Error>;
44
45 fn remove(&self, key: &K) -> Result<(), Self::Error>;
47
48 fn clear(&self) -> Result<(), Self::Error>;
50
51 fn is_empty(&self) -> bool;
53
54 fn iter(&'a self) -> Self::Iterator;
56
57 fn keys(&'a self) -> Self::Keys;
59
60 fn values(&'a self) -> Self::Values;
62
63 fn multi_get<J>(&self, keys: impl IntoIterator<Item = J>) -> Result<Vec<Option<V>>, Self::Error>
65 where
66 J: Borrow<K>,
67 {
68 keys.into_iter().map(|key| self.get(key.borrow())).collect()
69 }
70
71 fn multi_insert<J, U>(
73 &self,
74 key_val_pairs: impl IntoIterator<Item = (J, U)>,
75 ) -> Result<(), Self::Error>
76 where
77 J: Borrow<K>,
78 U: Borrow<V>,
79 {
80 key_val_pairs
81 .into_iter()
82 .try_for_each(|(key, value)| self.insert(key.borrow(), value.borrow()))
83 }
84
85 fn multi_remove<J>(&self, keys: impl IntoIterator<Item = J>) -> Result<(), Self::Error>
87 where
88 J: Borrow<K>,
89 {
90 keys.into_iter()
91 .try_for_each(|key| self.remove(key.borrow()))
92 }
93
94 fn try_catch_up_with_primary(&self) -> Result<(), Self::Error>;
96}
97
98pub trait TypedStoreDebug {
99 fn dump_table(
101 &self,
102 table_name: String,
103 page_size: u16,
104 page_number: usize,
105 ) -> eyre::Result<BTreeMap<String, String>>;
106
107 fn primary_db_name(&self) -> String;
109
110 fn describe_all_tables(&self) -> BTreeMap<String, (String, String)>;
112
113 fn count_table_keys(&self, table_name: String) -> eyre::Result<usize>;
115}