diff --git a/src/util/merkleblock.rs b/src/util/merkleblock.rs index 2dc371e7..bbfce09d 100644 --- a/src/util/merkleblock.rs +++ b/src/util/merkleblock.rs @@ -40,6 +40,8 @@ //! assert_eq!(1, index[0]); //! ``` +use core::fmt; + use crate::prelude::*; use crate::io; @@ -53,20 +55,45 @@ use crate::consensus::encode::{self, Decodable, Encodable}; use crate::util::merkleblock::MerkleBlockError::*; use crate::{Block, BlockHeader}; -/// An error when verifying the merkle block +/// An error when verifying the merkle block. #[derive(Clone, PartialEq, Eq, Debug)] #[non_exhaustive] pub enum MerkleBlockError { - /// When header merkle root don't match to the root calculated from the partial merkle tree + /// Merkle root in the header doesn't match to the root calculated from partial merkle tree. MerkleRootMismatch, - /// When partial merkle tree contains no transactions + /// Partial merkle tree contains no transactions. NoTransactions, - /// When there are too many transactions + /// There are too many transactions. TooManyTransactions, - /// General format error + /// General format error. BadFormat(String), } +impl fmt::Display for MerkleBlockError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + use self::MerkleBlockError::*; + + match *self { + MerkleRootMismatch => write!(f, "merkle header root doesn't match to the root calculated from the partial merkle tree"), + NoTransactions => write!(f, "partial merkle tree contains no transactions"), + TooManyTransactions => write!(f, "too many transactions"), + BadFormat(ref s) => write!(f, "general format error: {}", s), + } + } +} + +#[cfg(feature = "std")] +#[cfg_attr(docsrs, doc(cfg(feature = "std")))] +impl std::error::Error for MerkleBlockError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + use self::MerkleBlockError::*; + + match *self { + MerkleRootMismatch | NoTransactions | TooManyTransactions | BadFormat(_) => None, + } + } +} + /// Data structure that represents a partial merkle tree. /// /// It represents a subset of the txid's of a known block, in a way that