scrobble_scrubber/persistence/
memory_storage.rs1use async_trait::async_trait;
2use std::sync::{Arc, RwLock};
3
4use super::{
5 PendingEditsState, PendingRewriteRulesState, RewriteRulesState, SettingsState, StateStorage,
6 TimestampState,
7};
8
9#[derive(Debug)]
11pub struct MemoryStorage {
12 timestamp_state: Arc<RwLock<TimestampState>>,
13 rewrite_rules_state: Arc<RwLock<RewriteRulesState>>,
14 pending_edits_state: Arc<RwLock<PendingEditsState>>,
15 pending_rules_state: Arc<RwLock<PendingRewriteRulesState>>,
16 settings_state: Arc<RwLock<SettingsState>>,
17}
18
19#[derive(Debug, thiserror::Error)]
20pub enum MemoryStorageError {
21 #[error("Lock error: {0}")]
22 LockError(String),
23}
24
25impl MemoryStorage {
26 pub fn new() -> Self {
27 Self {
28 timestamp_state: Arc::new(RwLock::new(TimestampState::default())),
29 rewrite_rules_state: Arc::new(RwLock::new(RewriteRulesState::default())),
30 pending_edits_state: Arc::new(RwLock::new(PendingEditsState::default())),
31 pending_rules_state: Arc::new(RwLock::new(PendingRewriteRulesState::default())),
32 settings_state: Arc::new(RwLock::new(SettingsState::default())),
33 }
34 }
35
36 pub fn with_initial_rules(rules: RewriteRulesState) -> Self {
37 let storage = Self::new();
38 *storage.rewrite_rules_state.write().unwrap() = rules;
39 storage
40 }
41}
42
43impl Default for MemoryStorage {
44 fn default() -> Self {
45 Self::new()
46 }
47}
48
49#[async_trait]
50impl StateStorage for MemoryStorage {
51 type Error = MemoryStorageError;
52
53 async fn save_timestamp_state(&mut self, state: &TimestampState) -> Result<(), Self::Error> {
54 *self
55 .timestamp_state
56 .write()
57 .map_err(|e| MemoryStorageError::LockError(e.to_string()))? = state.clone();
58 Ok(())
59 }
60
61 async fn load_timestamp_state(&self) -> Result<TimestampState, Self::Error> {
62 Ok(self
63 .timestamp_state
64 .read()
65 .map_err(|e| MemoryStorageError::LockError(e.to_string()))?
66 .clone())
67 }
68
69 async fn save_rewrite_rules_state(
70 &mut self,
71 state: &RewriteRulesState,
72 ) -> Result<(), Self::Error> {
73 *self
74 .rewrite_rules_state
75 .write()
76 .map_err(|e| MemoryStorageError::LockError(e.to_string()))? = state.clone();
77 Ok(())
78 }
79
80 async fn load_rewrite_rules_state(&self) -> Result<RewriteRulesState, Self::Error> {
81 Ok(self
82 .rewrite_rules_state
83 .read()
84 .map_err(|e| MemoryStorageError::LockError(e.to_string()))?
85 .clone())
86 }
87
88 async fn save_pending_edits_state(
89 &mut self,
90 state: &PendingEditsState,
91 ) -> Result<(), Self::Error> {
92 *self
93 .pending_edits_state
94 .write()
95 .map_err(|e| MemoryStorageError::LockError(e.to_string()))? = state.clone();
96 Ok(())
97 }
98
99 async fn load_pending_edits_state(&self) -> Result<PendingEditsState, Self::Error> {
100 Ok(self
101 .pending_edits_state
102 .read()
103 .map_err(|e| MemoryStorageError::LockError(e.to_string()))?
104 .clone())
105 }
106
107 async fn save_pending_rewrite_rules_state(
108 &mut self,
109 state: &PendingRewriteRulesState,
110 ) -> Result<(), Self::Error> {
111 *self
112 .pending_rules_state
113 .write()
114 .map_err(|e| MemoryStorageError::LockError(e.to_string()))? = state.clone();
115 Ok(())
116 }
117
118 async fn load_pending_rewrite_rules_state(
119 &self,
120 ) -> Result<PendingRewriteRulesState, Self::Error> {
121 Ok(self
122 .pending_rules_state
123 .read()
124 .map_err(|e| MemoryStorageError::LockError(e.to_string()))?
125 .clone())
126 }
127
128 async fn save_settings_state(&mut self, state: &SettingsState) -> Result<(), Self::Error> {
129 *self
130 .settings_state
131 .write()
132 .map_err(|e| MemoryStorageError::LockError(e.to_string()))? = state.clone();
133 Ok(())
134 }
135
136 async fn load_settings_state(&self) -> Result<SettingsState, Self::Error> {
137 Ok(self
138 .settings_state
139 .read()
140 .map_err(|e| MemoryStorageError::LockError(e.to_string()))?
141 .clone())
142 }
143}