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