1use std::sync::Arc;
2
3use lwk_wollet::Persister;
4
5use crate::{LwkError, Update};
6
7#[uniffi::export(with_foreign)]
9pub trait ForeignPersister: Send + Sync {
10 fn get(&self, index: u64) -> Result<Option<Arc<Update>>, LwkError>;
12
13 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#[derive(uniffi::Object)]
25pub struct ForeignPersisterLink {
26 pub(crate) inner: Arc<dyn ForeignPersister>,
27}
28
29#[uniffi::export]
30impl ForeignPersisterLink {
31 #[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}