1use v_individual_model::onto::individual::Individual;
2
3#[derive(Eq, PartialEq, Debug, Clone)]
4pub enum StorageMode {
5 ReadOnly,
6 ReadWrite,
7}
8
9#[derive(Eq, PartialEq, Debug, Clone)]
10pub enum StorageId {
11 Individuals,
12 Tickets,
13 Az,
14}
15
16#[derive(Debug, Clone, PartialEq)]
18pub enum StorageResult<T> {
19 Ok(T),
20 NotFound,
21 NotReady,
22 UnprocessableEntity,
23 Error(String),
24}
25
26impl<T> StorageResult<T> {
27 pub fn is_ok(&self) -> bool {
28 matches!(self, StorageResult::Ok(_))
29 }
30
31 pub fn is_error(&self) -> bool {
32 !self.is_ok()
33 }
34
35 pub fn unwrap_or_default(self) -> T
36 where
37 T: Default,
38 {
39 match self {
40 StorageResult::Ok(value) => value,
41 _ => T::default(),
42 }
43 }
44
45 pub fn map<U, F>(self, f: F) -> StorageResult<U>
46 where
47 F: FnOnce(T) -> U,
48 {
49 match self {
50 StorageResult::Ok(value) => StorageResult::Ok(f(value)),
51 StorageResult::NotFound => StorageResult::NotFound,
52 StorageResult::NotReady => StorageResult::NotReady,
53 StorageResult::UnprocessableEntity => StorageResult::UnprocessableEntity,
54 StorageResult::Error(msg) => StorageResult::Error(msg),
55 }
56 }
57
58 pub fn and_then<U, F>(self, f: F) -> StorageResult<U>
59 where
60 F: FnOnce(T) -> StorageResult<U>,
61 {
62 match self {
63 StorageResult::Ok(value) => f(value),
64 StorageResult::NotFound => StorageResult::NotFound,
65 StorageResult::NotReady => StorageResult::NotReady,
66 StorageResult::UnprocessableEntity => StorageResult::UnprocessableEntity,
67 StorageResult::Error(msg) => StorageResult::Error(msg),
68 }
69 }
70}
71
72impl<T> From<StorageResult<T>> for bool {
73 fn from(result: StorageResult<T>) -> Self {
74 result.is_ok()
75 }
76}
77
78pub trait Storage {
79 fn get_individual(&mut self, storage: StorageId, id: &str, iraw: &mut Individual) -> StorageResult<()>;
80 fn get_value(&mut self, storage: StorageId, key: &str) -> StorageResult<String>;
81 fn get_raw_value(&mut self, storage: StorageId, key: &str) -> StorageResult<Vec<u8>>;
82 fn put_value(&mut self, storage: StorageId, key: &str, val: &str) -> StorageResult<()>;
83 fn put_raw_value(&mut self, storage: StorageId, key: &str, val: Vec<u8>) -> StorageResult<()>;
84 fn remove_value(&mut self, storage: StorageId, key: &str) -> StorageResult<()>;
85 fn count(&mut self, storage: StorageId) -> StorageResult<usize>;
86
87 #[deprecated(since = "0.1.0", note = "Use get_individual instead")]
89 fn get_individual_from_db(&mut self, storage: StorageId, id: &str, iraw: &mut Individual) -> StorageResult<()> {
90 self.get_individual(storage, id, iraw)
91 }
92
93 #[deprecated(since = "0.1.0", note = "Use get_value instead")]
94 fn get_v(&mut self, storage: StorageId, key: &str) -> Option<String> {
95 match self.get_value(storage, key) {
96 StorageResult::Ok(value) => Some(value),
97 _ => None,
98 }
99 }
100
101 #[deprecated(since = "0.1.0", note = "Use get_raw_value instead")]
102 fn get_raw(&mut self, storage: StorageId, key: &str) -> Vec<u8> {
103 self.get_raw_value(storage, key).unwrap_or_default()
104 }
105
106 #[deprecated(since = "0.1.0", note = "Use put_value instead")]
107 fn put_kv(&mut self, storage: StorageId, key: &str, val: &str) -> bool {
108 self.put_value(storage, key, val).is_ok()
109 }
110
111 #[deprecated(since = "0.1.0", note = "Use put_raw_value instead")]
112 fn put_kv_raw(&mut self, storage: StorageId, key: &str, val: Vec<u8>) -> bool {
113 self.put_raw_value(storage, key, val).is_ok()
114 }
115
116 #[deprecated(since = "0.1.0", note = "Use remove_value instead")]
117 fn remove(&mut self, storage: StorageId, key: &str) -> bool {
118 self.remove_value(storage, key).is_ok()
119 }
120}
121
122#[macro_export]
124macro_rules! impl_storage_dispatcher {
125 ($self:ident, $storage_field:expr, $operation:expr, $default:expr) => {
126 match $storage_field {
127 Some(storage) => $operation(storage),
128 None => $default,
129 }
130 };
131}
132
133pub trait StorageDispatcher {
135 type Storage;
136
137 fn with_storage<T, F>(&mut self, default_value: T, operation: F) -> T
138 where
139 F: FnOnce(&mut Self::Storage) -> T;
140
141 fn with_storage_result<F>(&mut self, operation: F) -> StorageResult<()>
142 where
143 F: FnOnce(&mut Self::Storage) -> StorageResult<()>,
144 {
145 self.with_storage(StorageResult::NotReady, operation)
146 }
147
148 fn with_storage_value<T, F>(&mut self, operation: F) -> StorageResult<T>
149 where
150 F: FnOnce(&mut Self::Storage) -> StorageResult<T>,
151 T: Default,
152 {
153 self.with_storage(StorageResult::NotReady, operation)
154 }
155}