Remove impl_std_error macro

We would like the codebase to be optimized for readability not ease of
development, as such code that is write-once-read-many should not use
macros.

Currently we use the `impl_std_error` macro to implement
`std::error::Error` for struct error types. This makes the code harder
to read at a glance because one has to think what the macro does.

Remove the `impl_std_error` macro and write the code explicitly.
This commit is contained in:
Tobin C. Harding 2023-10-04 12:35:01 +11:00
parent 6933ca4fc2
commit 2512dbafc2
No known key found for this signature in database
GPG Key ID: 40BF9E4C269D6607
10 changed files with 51 additions and 37 deletions

View File

@ -4,7 +4,6 @@ use internals::write_err;
use crate::address::{Address, NetworkUnchecked}; use crate::address::{Address, NetworkUnchecked};
use crate::blockdata::script::{witness_program, witness_version}; use crate::blockdata::script::{witness_program, witness_version};
use crate::error::impl_std_error;
use crate::prelude::String; use crate::prelude::String;
use crate::{base58, Network}; use crate::{base58, Network};
@ -91,7 +90,10 @@ impl fmt::Display for UnknownAddressTypeError {
} }
} }
impl_std_error!(UnknownAddressTypeError); #[cfg(feature = "std")]
impl std::error::Error for UnknownAddressTypeError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
}
/// Address parsing error. /// Address parsing error.
#[derive(Debug, PartialEq, Eq, Clone)] #[derive(Debug, PartialEq, Eq, Clone)]

View File

@ -413,4 +413,7 @@ mod error {
} }
} }
crate::error::impl_std_error!(PushBytesError); #[cfg(feature = "std")]
impl std::error::Error for PushBytesError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
}

View File

@ -18,7 +18,6 @@ use hashes::{hash_newtype, sha256, sha256d, sha256t_hash_newtype, Hash};
use crate::blockdata::witness::Witness; use crate::blockdata::witness::Witness;
use crate::consensus::{encode, Encodable}; use crate::consensus::{encode, Encodable};
use crate::error::impl_std_error;
use crate::prelude::*; use crate::prelude::*;
use crate::taproot::{LeafVersion, TapLeafHash, TAPROOT_ANNEX_PREFIX}; use crate::taproot::{LeafVersion, TapLeafHash, TAPROOT_ANNEX_PREFIX};
use crate::{io, Amount, Script, ScriptBuf, Sequence, Transaction, TxIn, TxOut}; use crate::{io, Amount, Script, ScriptBuf, Sequence, Transaction, TxIn, TxOut};
@ -533,7 +532,10 @@ impl fmt::Display for InvalidSighashTypeError {
} }
} }
impl_std_error!(InvalidSighashTypeError); #[cfg(feature = "std")]
impl std::error::Error for InvalidSighashTypeError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
}
/// This type is consensus valid but an input including it would prevent the transaction from /// This type is consensus valid but an input including it would prevent the transaction from
/// being relayed on today's Bitcoin network. /// being relayed on today's Bitcoin network.
@ -546,7 +548,10 @@ impl fmt::Display for NonStandardSighashTypeError {
} }
} }
impl_std_error!(NonStandardSighashTypeError); #[cfg(feature = "std")]
impl std::error::Error for NonStandardSighashTypeError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
}
/// Error returned for failure during parsing one of the sighash types. /// Error returned for failure during parsing one of the sighash types.
/// ///
@ -563,7 +568,10 @@ impl fmt::Display for SighashTypeParseError {
} }
} }
impl_std_error!(SighashTypeParseError); #[cfg(feature = "std")]
impl std::error::Error for SighashTypeParseError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
}
impl<R: Borrow<Transaction>> SighashCache<R> { impl<R: Borrow<Transaction>> SighashCache<R> {
/// Constructs a new `SighashCache` from an unsigned transaction. /// Constructs a new `SighashCache` from an unsigned transaction.

View File

@ -2,6 +2,4 @@
//! Contains error types and other error handling tools. //! Contains error types and other error handling tools.
pub(crate) use internals::impl_std_error;
pub use crate::parse::ParseIntError; pub use crate::parse::ParseIntError;

View File

@ -28,7 +28,6 @@ use internals::write_err;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::constants::ChainHash; use crate::constants::ChainHash;
use crate::error::impl_std_error;
use crate::p2p::Magic; use crate::p2p::Magic;
use crate::prelude::{String, ToOwned}; use crate::prelude::{String, ToOwned};
@ -202,7 +201,11 @@ impl fmt::Display for ParseNetworkError {
write_err!(f, "failed to parse {} as network", self.0; self) write_err!(f, "failed to parse {} as network", self.0; self)
} }
} }
impl_std_error!(ParseNetworkError);
#[cfg(feature = "std")]
impl std::error::Error for ParseNetworkError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
}
impl FromStr for Network { impl FromStr for Network {
type Err = ParseNetworkError; type Err = ParseNetworkError;
@ -246,7 +249,10 @@ impl Display for UnknownChainHashError {
} }
} }
impl_std_error!(UnknownChainHashError); #[cfg(feature = "std")]
impl std::error::Error for UnknownChainHashError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
}
impl TryFrom<ChainHash> for Network { impl TryFrom<ChainHash> for Network {
type Error = UnknownChainHashError; type Error = UnknownChainHashError;

View File

@ -144,7 +144,10 @@ impl fmt::Display for CommandStringError {
} }
} }
crate::error::impl_std_error!(CommandStringError); #[cfg(feature = "std")]
impl std::error::Error for CommandStringError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
}
/// A Network message /// A Network message
#[derive(Clone, Debug, PartialEq, Eq)] #[derive(Clone, Debug, PartialEq, Eq)]

View File

@ -30,7 +30,6 @@ use hex::FromHex;
use internals::{debug_from_display, write_err}; use internals::{debug_from_display, write_err};
use crate::consensus::encode::{self, Decodable, Encodable}; use crate::consensus::encode::{self, Decodable, Encodable};
use crate::error::impl_std_error;
use crate::prelude::{Borrow, BorrowMut, String, ToOwned}; use crate::prelude::{Borrow, BorrowMut, String, ToOwned};
use crate::{io, Network}; use crate::{io, Network};
@ -339,7 +338,11 @@ impl fmt::Display for ParseMagicError {
write_err!(f, "failed to parse {} as network magic", self.magic; self.error) write_err!(f, "failed to parse {} as network magic", self.magic; self.error)
} }
} }
impl_std_error!(ParseMagicError, error);
#[cfg(feature = "std")]
impl std::error::Error for ParseMagicError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { Some(&self.error) }
}
/// Error in creating a Network from Magic bytes. /// Error in creating a Network from Magic bytes.
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
@ -350,7 +353,11 @@ impl fmt::Display for UnknownMagicError {
write!(f, "unknown network magic {}", self.0) write!(f, "unknown network magic {}", self.0)
} }
} }
impl_std_error!(UnknownMagicError);
#[cfg(feature = "std")]
impl std::error::Error for UnknownMagicError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {

View File

@ -6,7 +6,6 @@ use core::str::FromStr;
use internals::write_err; use internals::write_err;
use crate::error::impl_std_error;
use crate::prelude::*; use crate::prelude::*;
/// Error with rich context returned when a string can't be parsed as an integer. /// Error with rich context returned when a string can't be parsed as an integer.
@ -43,7 +42,10 @@ impl fmt::Display for ParseIntError {
} }
} }
impl_std_error!(ParseIntError, source); #[cfg(feature = "std")]
impl std::error::Error for ParseIntError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { Some(&self.source) }
}
impl From<ParseIntError> for core::num::ParseIntError { impl From<ParseIntError> for core::num::ParseIntError {
fn from(value: ParseIntError) -> Self { value.source } fn from(value: ParseIntError) -> Self { value.source }

View File

@ -31,21 +31,3 @@ macro_rules! write_err {
} }
} }
} }
/// Impls std::error::Error for the specified type with appropriate attributes, possibly returning
/// source.
#[macro_export]
macro_rules! impl_std_error {
// No source available
($type:ty) => {
#[cfg(feature = "std")]
impl std::error::Error for $type {}
};
// Struct with $field as source
($type:ty, $field:ident) => {
#[cfg(feature = "std")]
impl std::error::Error for $type {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { Some(&self.$field) }
}
};
}

View File

@ -40,6 +40,9 @@ macro_rules! parse_error_type {
} }
} }
$crate::error::impl_std_error!($name, source); #[cfg(feature = "std")]
impl std::error::Error for $name {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { Some(&self.source) }
}
} }
} }