noosphere_ns/dht/
errors.rs1use 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}