Share OfflineWalletOperations

This commit is contained in:
Sudarsan Balaji 2021-10-16 14:19:29 +05:30
parent c15993310d
commit 2db59de659
2 changed files with 32 additions and 11 deletions

View File

@ -98,6 +98,7 @@ callback interface BdkProgress {
interface OnlineWallet { interface OnlineWallet {
[Throws=BdkError] [Throws=BdkError]
constructor(string descriptor, Network network, DatabaseConfig database_config, BlockchainConfig blockchain_config); constructor(string descriptor, Network network, DatabaseConfig database_config, BlockchainConfig blockchain_config);
string get_new_address();
Network get_network(); Network get_network();
[Throws=BdkError] [Throws=BdkError]
void sync(BdkProgress progress_update, u32? max_address_param); void sync(BdkProgress progress_update, u32? max_address_param);

View File

@ -10,7 +10,7 @@ use bdk::wallet::AddressIndex;
use bdk::Error; use bdk::Error;
use bdk::Wallet; use bdk::Wallet;
use std::convert::TryFrom; use std::convert::TryFrom;
use std::sync::Mutex; use std::sync::{Mutex, MutexGuard};
uniffi_macros::include_scaffolding!("bdk"); uniffi_macros::include_scaffolding!("bdk");
@ -42,10 +42,30 @@ pub enum BlockchainConfig {
Esplora { config: EsploraConfig }, Esplora { config: EsploraConfig },
} }
trait WalletHolder<B> {
fn get_wallet(&self) -> MutexGuard<Wallet<B, AnyDatabase>>;
}
struct OfflineWallet { struct OfflineWallet {
wallet: Mutex<Wallet<(), AnyDatabase>>, wallet: Mutex<Wallet<(), AnyDatabase>>,
} }
impl WalletHolder<()> for OfflineWallet {
fn get_wallet(&self) -> MutexGuard<Wallet<(), AnyDatabase>> {
self.wallet.lock().unwrap()
}
}
trait OfflineWalletOperations<B>: WalletHolder<B> {
fn get_new_address(&self) -> String {
self.get_wallet()
.get_address(AddressIndex::New)
.unwrap()
.address
.to_string()
}
}
impl OfflineWallet { impl OfflineWallet {
fn new( fn new(
descriptor: String, descriptor: String,
@ -60,18 +80,10 @@ impl OfflineWallet {
let wallet = Mutex::new(Wallet::new_offline(&descriptor, None, network, database)?); let wallet = Mutex::new(Wallet::new_offline(&descriptor, None, network, database)?);
Ok(OfflineWallet { wallet }) 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 { struct OnlineWallet {
wallet: Mutex<Wallet<AnyBlockchain, AnyDatabase>>, wallet: Mutex<Wallet<AnyBlockchain, AnyDatabase>>,
} }
@ -155,5 +167,13 @@ impl OnlineWallet {
} }
} }
impl WalletHolder<AnyBlockchain> for OnlineWallet {
fn get_wallet(&self) -> MutexGuard<Wallet<AnyBlockchain, AnyDatabase>> {
self.wallet.lock().unwrap()
}
}
impl OfflineWalletOperations<AnyBlockchain> for OnlineWallet {}
uniffi::deps::static_assertions::assert_impl_all!(OfflineWallet: Sync, Send); uniffi::deps::static_assertions::assert_impl_all!(OfflineWallet: Sync, Send);
uniffi::deps::static_assertions::assert_impl_all!(OnlineWallet: Sync, Send); uniffi::deps::static_assertions::assert_impl_all!(OnlineWallet: Sync, Send);