From 2db59de659ac2dde94448c8b5ad88f58c2ff3e5a Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Sat, 16 Oct 2021 14:19:29 +0530 Subject: [PATCH] Share OfflineWalletOperations --- src/bdk.udl | 1 + src/lib.rs | 42 +++++++++++++++++++++++++++++++----------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/bdk.udl b/src/bdk.udl index 4ceb2c3..0283237 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -98,6 +98,7 @@ callback interface BdkProgress { interface OnlineWallet { [Throws=BdkError] constructor(string descriptor, Network network, DatabaseConfig database_config, BlockchainConfig blockchain_config); + string get_new_address(); Network get_network(); [Throws=BdkError] void sync(BdkProgress progress_update, u32? max_address_param); diff --git a/src/lib.rs b/src/lib.rs index ab4398b..9bd5669 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,7 +10,7 @@ use bdk::wallet::AddressIndex; use bdk::Error; use bdk::Wallet; use std::convert::TryFrom; -use std::sync::Mutex; +use std::sync::{Mutex, MutexGuard}; uniffi_macros::include_scaffolding!("bdk"); @@ -42,10 +42,30 @@ pub enum BlockchainConfig { Esplora { config: EsploraConfig }, } +trait WalletHolder { + fn get_wallet(&self) -> MutexGuard>; +} + struct OfflineWallet { wallet: Mutex>, } +impl WalletHolder<()> for OfflineWallet { + fn get_wallet(&self) -> MutexGuard> { + self.wallet.lock().unwrap() + } +} + +trait OfflineWalletOperations: WalletHolder { + fn get_new_address(&self) -> String { + self.get_wallet() + .get_address(AddressIndex::New) + .unwrap() + .address + .to_string() + } +} + impl OfflineWallet { fn new( descriptor: String, @@ -60,18 +80,10 @@ impl OfflineWallet { let wallet = Mutex::new(Wallet::new_offline(&descriptor, None, network, database)?); Ok(OfflineWallet { wallet }) } - - fn get_new_address(&self) -> String { - self.wallet - .lock() - .unwrap() - .get_address(AddressIndex::New) - .unwrap() - .address - .to_string() - } } +impl OfflineWalletOperations<()> for OfflineWallet {} + struct OnlineWallet { wallet: Mutex>, } @@ -155,5 +167,13 @@ impl OnlineWallet { } } +impl WalletHolder for OnlineWallet { + fn get_wallet(&self) -> MutexGuard> { + self.wallet.lock().unwrap() + } +} + +impl OfflineWalletOperations for OnlineWallet {} + uniffi::deps::static_assertions::assert_impl_all!(OfflineWallet: Sync, Send); uniffi::deps::static_assertions::assert_impl_all!(OnlineWallet: Sync, Send);