bitcoin/dogecoin/address/
error.rs

1// SPDX-License-Identifier: Apache-2.0
2
3//! Error code for the address module.
4
5use core::fmt;
6
7use internals::write_err;
8
9use crate::dogecoin::address::{Address, NetworkUnchecked};
10use crate::dogecoin::Network;
11
12pub use crate::address::error::{
13    FromScriptError, InvalidBase58PayloadLengthError, InvalidLegacyPrefixError,
14    LegacyAddressTooLongError, P2shError,
15};
16
17/// Address parsing error.
18#[derive(Debug, Clone, PartialEq, Eq)]
19#[non_exhaustive]
20pub enum ParseError {
21    /// Base58 error.
22    Base58(base58::Error),
23    /// Legacy address is too long.
24    LegacyAddressTooLong(LegacyAddressTooLongError),
25    /// Invalid base58 payload data length for legacy address.
26    InvalidBase58PayloadLength(InvalidBase58PayloadLengthError),
27    /// Invalid legacy address prefix in base58 data payload.
28    InvalidLegacyPrefix(InvalidLegacyPrefixError),
29    /// Address's network differs from required one.
30    NetworkValidation(NetworkValidationError),
31}
32
33internals::impl_from_infallible!(ParseError);
34
35impl fmt::Display for ParseError {
36    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
37        use ParseError::*;
38
39        match *self {
40            Base58(ref e) => write_err!(f, "base58 error"; e),
41            LegacyAddressTooLong(ref e) => write_err!(f, "legacy address base58 string"; e),
42            InvalidBase58PayloadLength(ref e) => write_err!(f, "legacy address base58 data"; e),
43            InvalidLegacyPrefix(ref e) => write_err!(f, "legacy address base58 prefix"; e),
44            NetworkValidation(ref e) => write_err!(f, "validation error"; e),
45        }
46    }
47}
48
49#[cfg(feature = "std")]
50impl std::error::Error for ParseError {
51    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
52        use ParseError::*;
53
54        match *self {
55            Base58(ref e) => Some(e),
56            LegacyAddressTooLong(ref e) => Some(e),
57            InvalidBase58PayloadLength(ref e) => Some(e),
58            InvalidLegacyPrefix(ref e) => Some(e),
59            NetworkValidation(ref e) => Some(e),
60        }
61    }
62}
63
64impl From<base58::Error> for ParseError {
65    fn from(e: base58::Error) -> Self {
66        Self::Base58(e)
67    }
68}
69
70impl From<LegacyAddressTooLongError> for ParseError {
71    fn from(e: LegacyAddressTooLongError) -> Self {
72        Self::LegacyAddressTooLong(e)
73    }
74}
75
76impl From<InvalidBase58PayloadLengthError> for ParseError {
77    fn from(e: InvalidBase58PayloadLengthError) -> Self {
78        Self::InvalidBase58PayloadLength(e)
79    }
80}
81
82impl From<InvalidLegacyPrefixError> for ParseError {
83    fn from(e: InvalidLegacyPrefixError) -> Self {
84        Self::InvalidLegacyPrefix(e)
85    }
86}
87
88impl From<NetworkValidationError> for ParseError {
89    fn from(e: NetworkValidationError) -> Self {
90        Self::NetworkValidation(e)
91    }
92}
93
94/// Address's network differs from required one.
95#[derive(Debug, Clone, PartialEq, Eq)]
96pub struct NetworkValidationError {
97    /// Network that was required.
98    pub(crate) required: Network,
99    /// The address itself.
100    pub(crate) address: Address<NetworkUnchecked>,
101}
102
103impl fmt::Display for NetworkValidationError {
104    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
105        write!(f, "address ")?;
106        fmt::Display::fmt(&self.address.0, f)?;
107        write!(f, " is not valid on {}", self.required)
108    }
109}
110
111#[cfg(feature = "std")]
112impl std::error::Error for NetworkValidationError {}