feat(wallet): Add infallible Wallet get_address(), get_internal_address functions

refactor!(wallet)!: rename fallible Wallet try_get_address(), try_get_internal_address functions
This commit is contained in:
Steve Myers 2023-11-16 11:18:11 -06:00
parent 9e7d99e3bf
commit 77f9977c02
No known key found for this signature in database
GPG Key ID: 8105A46B22C2D051
4 changed files with 40 additions and 7 deletions

View File

@ -259,6 +259,29 @@ impl Wallet {
}
}
impl<D> Wallet<D>
where
D: PersistBackend<ChangeSet, WriteError = core::convert::Infallible>,
{
/// Infallibly return a derived address using the external descriptor, see [`AddressIndex`] for
/// available address index selection strategies. If none of the keys in the descriptor are derivable
/// (i.e. does not end with /*) then the same address will always be returned for any [`AddressIndex`].
pub fn get_address(&mut self, address_index: AddressIndex) -> AddressInfo {
self.try_get_address(address_index).unwrap()
}
/// Infallibly return a derived address using the internal (change) descriptor.
///
/// If the wallet doesn't have an internal descriptor it will use the external descriptor.
///
/// see [`AddressIndex`] for available address index selection strategies. If none of the keys
/// in the descriptor are derivable (i.e. does not end with /*) then the same address will always
/// be returned for any [`AddressIndex`].
pub fn get_internal_address(&mut self, address_index: AddressIndex) -> AddressInfo {
self.try_get_internal_address(address_index).unwrap()
}
}
/// The error type when constructing a fresh [`Wallet`].
///
/// Methods [`new`] and [`new_with_genesis_hash`] may return this error.
@ -611,27 +634,37 @@ impl<D> Wallet<D> {
/// Return a derived address using the external descriptor, see [`AddressIndex`] for
/// available address index selection strategies. If none of the keys in the descriptor are derivable
/// (i.e. does not end with /*) then the same address will always be returned for any [`AddressIndex`].
pub fn get_address(&mut self, address_index: AddressIndex) -> AddressInfo
///
/// A `PersistBackend<ChangeSet>::WriteError` will result if unable to persist the new address
/// to the `PersistBackend`.
pub fn try_get_address(
&mut self,
address_index: AddressIndex,
) -> Result<AddressInfo, D::WriteError>
where
D: PersistBackend<ChangeSet>,
{
self._get_address(KeychainKind::External, address_index)
.expect("persistence backend must not fail")
}
/// Return a derived address using the internal (change) descriptor.
///
/// If the wallet doesn't have an internal descriptor it will use the external descriptor.
///
/// A `PersistBackend<ChangeSet>::WriteError` will result if unable to persist the new address
/// to the `PersistBackend`.
///
/// see [`AddressIndex`] for available address index selection strategies. If none of the keys
/// in the descriptor are derivable (i.e. does not end with /*) then the same address will always
/// be returned for any [`AddressIndex`].
pub fn get_internal_address(&mut self, address_index: AddressIndex) -> AddressInfo
pub fn try_get_internal_address(
&mut self,
address_index: AddressIndex,
) -> Result<AddressInfo, D::WriteError>
where
D: PersistBackend<ChangeSet>,
{
self._get_address(KeychainKind::Internal, address_index)
.expect("persistence backend must not fail")
}
/// Return a derived address using the specified `keychain` (external/internal).

View File

@ -29,7 +29,7 @@ fn main() -> Result<(), anyhow::Error> {
Network::Testnet,
)?;
let address = wallet.get_address(bdk::wallet::AddressIndex::New);
let address = wallet.try_get_address(bdk::wallet::AddressIndex::New)?;
println!("Generated Address: {}", address);
let balance = wallet.get_balance();

View File

@ -27,7 +27,7 @@ async fn main() -> Result<(), anyhow::Error> {
Network::Testnet,
)?;
let address = wallet.get_address(AddressIndex::New);
let address = wallet.try_get_address(AddressIndex::New)?;
println!("Generated Address: {}", address);
let balance = wallet.get_balance();

View File

@ -26,7 +26,7 @@ fn main() -> Result<(), anyhow::Error> {
Network::Testnet,
)?;
let address = wallet.get_address(AddressIndex::New);
let address = wallet.try_get_address(AddressIndex::New)?;
println!("Generated Address: {}", address);
let balance = wallet.get_balance();