lwk/
persister.rs

1use std::sync::Arc;
2
3use lwk_wollet::Persister;
4
5use crate::{LwkError, Update};
6
7/// An exported trait, useful for caller-defined persistence.
8#[uniffi::export(with_foreign)]
9pub trait ForeignPersister: Send + Sync {
10    /// Return the update at the given index
11    fn get(&self, index: u64) -> Result<Option<Arc<Update>>, LwkError>;
12
13    /// Push an update
14    fn push(&self, update: Arc<Update>) -> Result<(), LwkError>;
15}
16
17impl From<LwkError> for lwk_wollet::PersistError {
18    fn from(e: LwkError) -> Self {
19        lwk_wollet::PersistError::Other(format!("{e:?}"))
20    }
21}
22
23/// An object to define persistency at the caller level
24#[derive(uniffi::Object)]
25pub struct ForeignPersisterLink {
26    pub(crate) inner: Arc<dyn ForeignPersister>,
27}
28
29#[uniffi::export]
30impl ForeignPersisterLink {
31    /// Create a new `ForeignPersisterLink`
32    #[uniffi::constructor]
33    pub fn new(persister: Arc<dyn ForeignPersister>) -> Self {
34        Self { inner: persister }
35    }
36}
37
38impl Persister for ForeignPersisterLink {
39    fn push(&self, update: lwk_wollet::Update) -> Result<(), lwk_wollet::PersistError> {
40        self.inner.push(Arc::new(update.into()))?;
41        Ok(())
42    }
43
44    fn get(&self, index: usize) -> Result<Option<lwk_wollet::Update>, lwk_wollet::PersistError> {
45        Ok(self
46            .inner
47            .get(index as u64)
48            .map(|r| r.map(|o| o.as_ref().into()))?)
49    }
50}