use core::fmt;
use internals::write_err;
use crate::dogecoin::address::{Address, NetworkUnchecked};
use crate::dogecoin::Network;
pub use crate::address::error::{
FromScriptError, InvalidBase58PayloadLengthError, InvalidLegacyPrefixError,
LegacyAddressTooLongError, P2shError,
};
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum ParseError {
Base58(base58::Error),
LegacyAddressTooLong(LegacyAddressTooLongError),
InvalidBase58PayloadLength(InvalidBase58PayloadLengthError),
InvalidLegacyPrefix(InvalidLegacyPrefixError),
NetworkValidation(NetworkValidationError),
}
internals::impl_from_infallible!(ParseError);
impl fmt::Display for ParseError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use ParseError::*;
match *self {
Base58(ref e) => write_err!(f, "base58 error"; e),
LegacyAddressTooLong(ref e) => write_err!(f, "legacy address base58 string"; e),
InvalidBase58PayloadLength(ref e) => write_err!(f, "legacy address base58 data"; e),
InvalidLegacyPrefix(ref e) => write_err!(f, "legacy address base58 prefix"; e),
NetworkValidation(ref e) => write_err!(f, "validation error"; e),
}
}
}
#[cfg(feature = "std")]
impl std::error::Error for ParseError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
use ParseError::*;
match *self {
Base58(ref e) => Some(e),
LegacyAddressTooLong(ref e) => Some(e),
InvalidBase58PayloadLength(ref e) => Some(e),
InvalidLegacyPrefix(ref e) => Some(e),
NetworkValidation(ref e) => Some(e),
}
}
}
impl From<base58::Error> for ParseError {
fn from(e: base58::Error) -> Self {
Self::Base58(e)
}
}
impl From<LegacyAddressTooLongError> for ParseError {
fn from(e: LegacyAddressTooLongError) -> Self {
Self::LegacyAddressTooLong(e)
}
}
impl From<InvalidBase58PayloadLengthError> for ParseError {
fn from(e: InvalidBase58PayloadLengthError) -> Self {
Self::InvalidBase58PayloadLength(e)
}
}
impl From<InvalidLegacyPrefixError> for ParseError {
fn from(e: InvalidLegacyPrefixError) -> Self {
Self::InvalidLegacyPrefix(e)
}
}
impl From<NetworkValidationError> for ParseError {
fn from(e: NetworkValidationError) -> Self {
Self::NetworkValidation(e)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NetworkValidationError {
pub(crate) required: Network,
pub(crate) address: Address<NetworkUnchecked>,
}
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 {}