From a92dc9c35cd0b231d57bfa2915192bb1ab537bd5 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Tue, 27 Feb 2024 11:08:38 +1100 Subject: [PATCH 1/2] Add NetworkValidationError The `require_network` function can fail in one way only, add a specific error for the failure. --- bitcoin/src/address/error.rs | 20 ++++++++++++++++++++ bitcoin/src/address/mod.rs | 6 +++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/bitcoin/src/address/error.rs b/bitcoin/src/address/error.rs index c522656e..a61dcc73 100644 --- a/bitcoin/src/address/error.rs +++ b/bitcoin/src/address/error.rs @@ -9,6 +9,26 @@ use crate::blockdata::script::{witness_program, witness_version}; use crate::prelude::*; use crate::{base58, Network}; +/// Address's network differs from required one. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct NetworkValidationError { + /// Network that was required. + pub(crate) required: Network, + /// The address itself. + pub(crate) address: Address, +} + +impl fmt::Display for NetworkValidationError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "address ")?; + fmt::Display::fmt(&self.address.0, f)?; + write!(f, " is not valid on {}", self.required) + } +} + +#[cfg(feature = "std")] +impl std::error::Error for NetworkValidationError {} + /// Address error. #[derive(Debug, Clone, PartialEq, Eq)] #[non_exhaustive] diff --git a/bitcoin/src/address/mod.rs b/bitcoin/src/address/mod.rs index a8e058e6..ac3e6b8b 100644 --- a/bitcoin/src/address/mod.rs +++ b/bitcoin/src/address/mod.rs @@ -55,7 +55,7 @@ use self::error::P2shError; #[rustfmt::skip] // Keep public re-exports separate. #[doc(inline)] pub use self::{ - error::{Error, ParseError, UnknownAddressTypeError, UnknownHrpError, FromScriptError}, + error::{Error, NetworkValidationError, ParseError, UnknownAddressTypeError, UnknownHrpError, FromScriptError, }, }; /// The different types of addresses. @@ -667,11 +667,11 @@ impl Address { /// For details about this mechanism, see section [*Parsing addresses*](Address#parsing-addresses) /// on [`Address`]. #[inline] - pub fn require_network(self, required: Network) -> Result { + pub fn require_network(self, required: Network) -> Result { if self.is_valid_for_network(required) { Ok(self.assume_checked()) } else { - Err(Error::NetworkValidation { required, address: self }) + Err(NetworkValidationError { required, address: self }) } } From 7e2a81d03b2c4df158d58d32049fc71a69b4fcc7 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Tue, 27 Feb 2024 11:10:03 +1100 Subject: [PATCH 2/2] Remove unused address::Error type --- bitcoin/src/address/error.rs | 42 ------------------------------------ bitcoin/src/address/mod.rs | 2 +- 2 files changed, 1 insertion(+), 43 deletions(-) diff --git a/bitcoin/src/address/error.rs b/bitcoin/src/address/error.rs index a61dcc73..e8018436 100644 --- a/bitcoin/src/address/error.rs +++ b/bitcoin/src/address/error.rs @@ -29,48 +29,6 @@ impl fmt::Display for NetworkValidationError { #[cfg(feature = "std")] impl std::error::Error for NetworkValidationError {} -/// Address error. -#[derive(Debug, Clone, PartialEq, Eq)] -#[non_exhaustive] -pub enum Error { - /// Address's network differs from required one. - NetworkValidation { - /// Network that was required. - required: Network, - /// The address itself - address: Address, - }, - /// Unknown hrp for current bitcoin networks (in bech32 address). - UnknownHrp(UnknownHrpError), -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - use Error::*; - - match *self { - NetworkValidation { required, ref address } => { - write!(f, "address ")?; - fmt::Display::fmt(&address.0, f)?; - write!(f, " is not valid on {}", required) - } - Error::UnknownHrp(ref e) => write_err!(f, "unknown hrp"; e), - } - } -} - -#[cfg(feature = "std")] -impl std::error::Error for Error { - fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - use Error::*; - - match *self { - UnknownHrp(ref e) => Some(e), - NetworkValidation { .. } => None, - } - } -} - /// Error while generating address from script. #[derive(Debug, Clone, PartialEq, Eq)] #[non_exhaustive] diff --git a/bitcoin/src/address/mod.rs b/bitcoin/src/address/mod.rs index ac3e6b8b..7bb66e12 100644 --- a/bitcoin/src/address/mod.rs +++ b/bitcoin/src/address/mod.rs @@ -55,7 +55,7 @@ use self::error::P2shError; #[rustfmt::skip] // Keep public re-exports separate. #[doc(inline)] pub use self::{ - error::{Error, NetworkValidationError, ParseError, UnknownAddressTypeError, UnknownHrpError, FromScriptError, }, + error::{NetworkValidationError, ParseError, UnknownAddressTypeError, UnknownHrpError, FromScriptError, }, }; /// The different types of addresses.