v_storage/
common.rs

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/// Унифицированный результат операций с хранилищем
17#[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 methods for backward compatibility
88    #[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/// Макрос для устранения дублирования кода диспетчеризации
123#[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
133/// Хелпер-трейт для упрощения диспетчеризации
134pub 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}