breez_sdk_liquid/wallet/
persister.rs1use 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}