noosphere_ns/dht/
errors.rs

1use anyhow;
2use libp2p::{kad, kad::record::store::Error as KadStorageError, TransportError};
3use noosphere_common::channel::ChannelError;
4use std::fmt;
5use std::io;
6
7#[derive(Debug)]
8pub enum DhtError {
9    Error(String),
10    IO(io::ErrorKind),
11    ValidationError(Vec<u8>),
12    LibP2PTransportError(Option<libp2p::Multiaddr>),
13    LibP2PStorageError(KadStorageError),
14    LibP2PGetRecordError(kad::GetRecordError),
15    LibP2PBootstrapError(kad::BootstrapError),
16    LibP2PPutRecordError(kad::PutRecordError),
17    LibP2PAddProviderError(kad::AddProviderError),
18    LibP2PGetProvidersError(kad::GetProvidersError),
19    NotConnected,
20    NoKnownPeers,
21}
22
23impl std::error::Error for DhtError {}
24impl fmt::Display for DhtError {
25    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
26        match self {
27            DhtError::NotConnected => write!(fmt, "DHT not running"),
28            DhtError::NoKnownPeers => write!(fmt, "no known peers"),
29            DhtError::LibP2PTransportError(e) => write!(fmt, "{e:#?}"),
30            DhtError::LibP2PStorageError(e) => write!(fmt, "{e:#?}"),
31            DhtError::LibP2PGetRecordError(e) => write!(fmt, "{e:#?}"),
32            DhtError::LibP2PPutRecordError(e) => write!(fmt, "{e:#?}"),
33            DhtError::LibP2PBootstrapError(e) => write!(fmt, "{e:#?}"),
34            DhtError::LibP2PAddProviderError(e) => write!(fmt, "{e:#?}"),
35            DhtError::LibP2PGetProvidersError(e) => write!(fmt, "{e:#?}"),
36            DhtError::IO(k) => write!(fmt, "{k:#?}"),
37            DhtError::Error(m) => write!(fmt, "{m:#?}"),
38            DhtError::ValidationError(_) => write!(fmt, "validation error"),
39        }
40    }
41}
42
43impl From<ChannelError> for DhtError {
44    fn from(e: ChannelError) -> Self {
45        match e {
46            ChannelError::RecvError => DhtError::Error("RecvError".into()),
47            ChannelError::SendError => DhtError::Error("SendError".into()),
48        }
49    }
50}
51
52impl From<anyhow::Error> for DhtError {
53    fn from(e: anyhow::Error) -> Self {
54        DhtError::Error(e.to_string())
55    }
56}
57
58impl From<io::Error> for DhtError {
59    fn from(e: io::Error) -> Self {
60        DhtError::IO(e.kind())
61    }
62}
63
64impl<TErr> From<TransportError<TErr>> for DhtError {
65    fn from(e: TransportError<TErr>) -> Self {
66        match e {
67            TransportError::MultiaddrNotSupported(addr) => {
68                DhtError::LibP2PTransportError(Some(addr))
69            }
70            TransportError::Other(_) => DhtError::LibP2PTransportError(None),
71        }
72    }
73}
74
75impl From<KadStorageError> for DhtError {
76    fn from(e: KadStorageError) -> Self {
77        DhtError::LibP2PStorageError(e)
78    }
79}
80
81impl From<kad::GetRecordError> for DhtError {
82    fn from(e: kad::GetRecordError) -> Self {
83        DhtError::LibP2PGetRecordError(e)
84    }
85}
86
87impl From<kad::PutRecordError> for DhtError {
88    fn from(e: kad::PutRecordError) -> Self {
89        DhtError::LibP2PPutRecordError(e)
90    }
91}
92
93impl From<kad::BootstrapError> for DhtError {
94    fn from(e: kad::BootstrapError) -> Self {
95        DhtError::LibP2PBootstrapError(e)
96    }
97}
98
99impl From<kad::AddProviderError> for DhtError {
100    fn from(e: kad::AddProviderError) -> Self {
101        DhtError::LibP2PAddProviderError(e)
102    }
103}
104
105impl From<kad::GetProvidersError> for DhtError {
106    fn from(e: kad::GetProvidersError) -> Self {
107        DhtError::LibP2PGetProvidersError(e)
108    }
109}