parity_multiaddr/
errors.rs

1use std::{net, fmt, error, io, num, str, string};
2use unsigned_varint::decode;
3
4pub type Result<T> = ::std::result::Result<T, Error>;
5
6/// Error types
7#[derive(Debug)]
8#[non_exhaustive]
9pub enum Error {
10    DataLessThanLen,
11    InvalidMultiaddr,
12    InvalidProtocolString,
13    InvalidUvar(decode::Error),
14    ParsingError(Box<dyn error::Error + Send + Sync>),
15    UnknownProtocolId(u32),
16    UnknownProtocolString(String),
17}
18
19impl fmt::Display for Error {
20    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21        match self {
22            Error::DataLessThanLen => f.write_str("we have less data than indicated by length"),
23            Error::InvalidMultiaddr => f.write_str("invalid multiaddr"),
24            Error::InvalidProtocolString => f.write_str("invalid protocol string"),
25            Error::InvalidUvar(e) => write!(f, "failed to decode unsigned varint: {}", e),
26            Error::ParsingError(e) => write!(f, "failed to parse: {}", e),
27            Error::UnknownProtocolId(id) => write!(f, "unknown protocol id: {}", id),
28            Error::UnknownProtocolString(string) => write!(f, "unknown protocol string: {}", string),
29        }
30    }
31}
32
33impl error::Error for Error {
34    #[inline]
35    fn cause(&self) -> Option<&dyn error::Error> {
36        if let Error::ParsingError(e) = self {
37            Some(&**e)
38        } else {
39            None
40        }
41    }
42}
43
44impl From<io::Error> for Error {
45    fn from(err: io::Error) -> Error {
46        Error::ParsingError(err.into())
47    }
48}
49
50impl From<multihash::Error> for Error {
51    fn from(err: multihash::Error) -> Error {
52        Error::ParsingError(err.into())
53    }
54}
55
56impl From<bs58::decode::Error> for Error {
57    fn from(err: bs58::decode::Error) -> Error {
58        Error::ParsingError(err.into())
59    }
60}
61
62impl From<net::AddrParseError> for Error {
63    fn from(err: net::AddrParseError) -> Error {
64        Error::ParsingError(err.into())
65    }
66}
67
68impl From<num::ParseIntError> for Error {
69    fn from(err: num::ParseIntError) -> Error {
70        Error::ParsingError(err.into())
71    }
72}
73
74impl From<string::FromUtf8Error> for Error {
75    fn from(err: string::FromUtf8Error) -> Error {
76        Error::ParsingError(err.into())
77    }
78}
79
80impl From<str::Utf8Error> for Error {
81    fn from(err: str::Utf8Error) -> Error {
82        Error::ParsingError(err.into())
83    }
84}
85
86impl From<decode::Error> for Error {
87    fn from(e: decode::Error) -> Error {
88        Error::InvalidUvar(e)
89    }
90}