1use std::{collections::HashMap, sync::Arc};
2
3use serde::{Deserialize, Serialize};
4
5use crate::persist::{Storage, StorageError};
6
7pub(crate) struct SyncStorageWrapper {
8 pub inner: Arc<dyn Storage>,
9}
10
11impl SyncStorageWrapper {
12 pub fn new(inner: Arc<dyn Storage>) -> Self {
13 Self { inner }
14 }
15}
16
17fn storage_to_sync_error(value: StorageError) -> breez_sdk_common::sync::storage::SyncStorageError {
18 match value {
19 StorageError::Connection(msg) | StorageError::Implementation(msg) => {
20 breez_sdk_common::sync::storage::SyncStorageError::Implementation(msg)
21 }
22 StorageError::InitializationError(msg) => {
23 breez_sdk_common::sync::storage::SyncStorageError::InitializationError(msg)
24 }
25 StorageError::Serialization(msg) => {
26 breez_sdk_common::sync::storage::SyncStorageError::Serialization(msg)
27 }
28 StorageError::NotFound => {
29 breez_sdk_common::sync::storage::SyncStorageError::Implementation(
30 "Not found".to_string(),
31 )
32 }
33 }
34}
35
36#[macros::async_trait]
37impl breez_sdk_common::sync::storage::SyncStorage for SyncStorageWrapper {
38 async fn add_outgoing_change(
39 &self,
40 record: breez_sdk_common::sync::storage::UnversionedRecordChange,
41 ) -> Result<u64, breez_sdk_common::sync::storage::SyncStorageError> {
42 self.inner
43 .add_outgoing_change(record.into())
44 .await
45 .map_err(storage_to_sync_error)
46 }
47
48 async fn complete_outgoing_sync(
49 &self,
50 record: breez_sdk_common::sync::storage::Record,
51 local_revision: u64,
52 ) -> Result<(), breez_sdk_common::sync::storage::SyncStorageError> {
53 self.inner
54 .complete_outgoing_sync(record.into(), local_revision)
55 .await
56 .map_err(storage_to_sync_error)
57 }
58
59 async fn get_pending_outgoing_changes(
60 &self,
61 limit: u32,
62 ) -> Result<
63 Vec<breez_sdk_common::sync::storage::OutgoingChange>,
64 breez_sdk_common::sync::storage::SyncStorageError,
65 > {
66 let changes = self
67 .inner
68 .get_pending_outgoing_changes(limit)
69 .await
70 .map_err(storage_to_sync_error)?;
71 Ok(changes.into_iter().map(From::from).collect())
72 }
73
74 async fn get_last_revision(
75 &self,
76 ) -> Result<u64, breez_sdk_common::sync::storage::SyncStorageError> {
77 self.inner
78 .get_last_revision()
79 .await
80 .map_err(storage_to_sync_error)
81 }
82
83 async fn insert_incoming_records(
84 &self,
85 records: Vec<breez_sdk_common::sync::storage::Record>,
86 ) -> Result<(), breez_sdk_common::sync::storage::SyncStorageError> {
87 let recs: Vec<Record> = records.into_iter().map(From::from).collect();
88 self.inner
89 .insert_incoming_records(recs)
90 .await
91 .map_err(storage_to_sync_error)
92 }
93
94 async fn delete_incoming_record(
95 &self,
96 record: breez_sdk_common::sync::storage::Record,
97 ) -> Result<(), breez_sdk_common::sync::storage::SyncStorageError> {
98 self.inner
99 .delete_incoming_record(record.into())
100 .await
101 .map_err(storage_to_sync_error)
102 }
103
104 async fn get_incoming_records(
105 &self,
106 limit: u32,
107 ) -> Result<
108 Vec<breez_sdk_common::sync::storage::IncomingChange>,
109 breez_sdk_common::sync::storage::SyncStorageError,
110 > {
111 let changes = self
112 .inner
113 .get_incoming_records(limit)
114 .await
115 .map_err(storage_to_sync_error)?;
116 Ok(changes.into_iter().map(From::from).collect())
117 }
118
119 async fn get_latest_outgoing_change(
120 &self,
121 ) -> Result<
122 Option<breez_sdk_common::sync::storage::OutgoingChange>,
123 breez_sdk_common::sync::storage::SyncStorageError,
124 > {
125 let change = self
126 .inner
127 .get_latest_outgoing_change()
128 .await
129 .map_err(storage_to_sync_error)?;
130 Ok(change.map(From::from))
131 }
132
133 async fn update_record_from_incoming(
134 &self,
135 record: breez_sdk_common::sync::storage::Record,
136 ) -> Result<(), breez_sdk_common::sync::storage::SyncStorageError> {
137 self.inner
138 .update_record_from_incoming(record.into())
139 .await
140 .map_err(storage_to_sync_error)
141 }
142}
143
144#[derive(Debug, Clone, Deserialize, Serialize)]
145#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
146pub struct RecordId {
147 pub r#type: String,
148 pub data_id: String,
149}
150
151impl RecordId {
152 pub fn new(r#type: String, data_id: String) -> Self {
153 RecordId { r#type, data_id }
154 }
155}
156
157impl From<breez_sdk_common::sync::storage::RecordId> for RecordId {
158 fn from(value: breez_sdk_common::sync::storage::RecordId) -> Self {
159 RecordId {
160 r#type: value.r#type,
161 data_id: value.data_id,
162 }
163 }
164}
165
166impl From<RecordId> for breez_sdk_common::sync::storage::RecordId {
167 fn from(value: RecordId) -> Self {
168 breez_sdk_common::sync::storage::RecordId {
169 r#type: value.r#type,
170 data_id: value.data_id,
171 }
172 }
173}
174
175#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
176#[derive(Clone, Debug)]
177pub struct IncomingChange {
178 pub new_state: Record,
179 pub old_state: Option<Record>,
180}
181
182impl From<breez_sdk_common::sync::storage::IncomingChange> for IncomingChange {
183 fn from(value: breez_sdk_common::sync::storage::IncomingChange) -> Self {
184 IncomingChange {
185 new_state: value.new_state.into(),
186 old_state: value.old_state.map(From::from),
187 }
188 }
189}
190
191impl From<IncomingChange> for breez_sdk_common::sync::storage::IncomingChange {
192 fn from(value: IncomingChange) -> Self {
193 breez_sdk_common::sync::storage::IncomingChange {
194 new_state: value.new_state.into(),
195 old_state: value.old_state.map(From::from),
196 }
197 }
198}
199
200#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
201#[derive(Clone, Debug)]
202pub struct OutgoingChange {
203 pub change: RecordChange,
204 pub parent: Option<Record>,
205}
206
207impl From<breez_sdk_common::sync::storage::OutgoingChange> for OutgoingChange {
208 fn from(value: breez_sdk_common::sync::storage::OutgoingChange) -> Self {
209 OutgoingChange {
210 change: value.change.into(),
211 parent: value.parent.map(From::from),
212 }
213 }
214}
215
216impl From<OutgoingChange> for breez_sdk_common::sync::storage::OutgoingChange {
217 fn from(value: OutgoingChange) -> Self {
218 breez_sdk_common::sync::storage::OutgoingChange {
219 change: value.change.into(),
220 parent: value.parent.map(From::from),
221 }
222 }
223}
224
225#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
226#[derive(Clone, Debug)]
227pub struct UnversionedRecordChange {
228 pub id: RecordId,
229 pub schema_version: String,
230 pub updated_fields: HashMap<String, String>,
231}
232
233impl From<breez_sdk_common::sync::storage::UnversionedRecordChange> for UnversionedRecordChange {
234 fn from(value: breez_sdk_common::sync::storage::UnversionedRecordChange) -> Self {
235 UnversionedRecordChange {
236 id: value.id.into(),
237 schema_version: value.schema_version,
238 updated_fields: value.updated_fields,
239 }
240 }
241}
242
243impl From<UnversionedRecordChange> for breez_sdk_common::sync::storage::UnversionedRecordChange {
244 fn from(value: UnversionedRecordChange) -> Self {
245 breez_sdk_common::sync::storage::UnversionedRecordChange {
246 id: value.id.into(),
247 schema_version: value.schema_version,
248 updated_fields: value.updated_fields,
249 }
250 }
251}
252
253#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
254#[derive(Clone, Debug)]
255pub struct RecordChange {
256 pub id: RecordId,
257 pub schema_version: String,
258 pub updated_fields: HashMap<String, String>,
259 pub local_revision: u64,
260}
261
262impl From<breez_sdk_common::sync::storage::RecordChange> for RecordChange {
263 fn from(value: breez_sdk_common::sync::storage::RecordChange) -> Self {
264 RecordChange {
265 id: value.id.into(),
266 schema_version: value.schema_version,
267 updated_fields: value.updated_fields,
268 local_revision: value.local_revision,
269 }
270 }
271}
272
273impl From<RecordChange> for breez_sdk_common::sync::storage::RecordChange {
274 fn from(value: RecordChange) -> Self {
275 breez_sdk_common::sync::storage::RecordChange {
276 id: value.id.into(),
277 schema_version: value.schema_version,
278 updated_fields: value.updated_fields,
279 local_revision: value.local_revision,
280 }
281 }
282}
283
284#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
285#[derive(Clone, Debug)]
286pub struct Record {
287 pub id: RecordId,
288 pub revision: u64,
289 pub schema_version: String,
290 pub data: HashMap<String, String>,
291}
292
293impl From<breez_sdk_common::sync::storage::Record> for Record {
294 fn from(value: breez_sdk_common::sync::storage::Record) -> Self {
295 Record {
296 id: value.id.into(),
297 revision: value.revision,
298 schema_version: value.schema_version,
299 data: value.data,
300 }
301 }
302}
303
304impl From<Record> for breez_sdk_common::sync::storage::Record {
305 fn from(value: Record) -> Self {
306 breez_sdk_common::sync::storage::Record {
307 id: value.id.into(),
308 revision: value.revision,
309 schema_version: value.schema_version,
310 data: value.data,
311 }
312 }
313}