breez_sdk_liquid/wallet/
persister.rs

1use anyhow::Result;
2use log::warn;
3use lwk_wollet::{ElementsNetwork, FsPersister, NoPersist, WolletDescriptor};
4use maybe_sync::{MaybeSend, MaybeSync};
5use std::path::PathBuf;
6use std::str::FromStr;
7
8pub use lwk_wollet;
9
10pub type LwkPersister = std::sync::Arc<dyn lwk_wollet::Persister + Send + Sync>;
11
12#[sdk_macros::async_trait]
13pub trait WalletCachePersister: MaybeSend + MaybeSync {
14    fn get_lwk_persister(&self) -> Result<LwkPersister>;
15
16    async fn clear_cache(&self) -> Result<()>;
17}
18
19#[derive(Clone)]
20pub struct FsWalletCachePersister {
21    working_dir: String,
22    descriptor: WolletDescriptor,
23    elements_network: ElementsNetwork,
24}
25
26impl FsWalletCachePersister {
27    pub(crate) fn new(
28        working_dir: String,
29        descriptor: WolletDescriptor,
30        elements_network: ElementsNetwork,
31    ) -> Result<Self> {
32        let working_dir_buf = PathBuf::from_str(&working_dir)?;
33        if !working_dir_buf.exists() {
34            std::fs::create_dir_all(&working_dir_buf)?;
35        }
36
37        Ok(Self {
38            working_dir,
39            descriptor,
40            elements_network,
41        })
42    }
43}
44
45#[sdk_macros::async_trait]
46impl WalletCachePersister for FsWalletCachePersister {
47    fn get_lwk_persister(&self) -> Result<LwkPersister> {
48        Ok(FsPersister::new(
49            &self.working_dir,
50            self.elements_network,
51            &self.descriptor,
52        )?)
53    }
54
55    async fn clear_cache(&self) -> Result<()> {
56        let mut path = std::path::PathBuf::from(&self.working_dir);
57        path.push(self.elements_network.as_str());
58        warn!("Wiping wallet in path: {:?}", path);
59        std::fs::remove_dir_all(&path)?;
60        Ok(())
61    }
62}
63
64#[derive(Clone)]
65pub struct NoWalletCachePersister {}
66
67#[sdk_macros::async_trait]
68impl WalletCachePersister for NoWalletCachePersister {
69    fn get_lwk_persister(&self) -> Result<LwkPersister> {
70        Ok(NoPersist::new())
71    }
72
73    async fn clear_cache(&self) -> Result<()> {
74        Ok(())
75    }
76}