noosphere-ns 0.1.0

A P2P name system for Noosphere
Documentation
use crate::dht::channel::ChannelError;
use anyhow;
use libp2p::{kad, kad::record::store::Error as KadStorageError, TransportError};
use std::fmt;
use std::io;

#[derive(Debug)]
pub enum DHTError {
    Error(String),
    IO(io::ErrorKind),
    ValidationError(Vec<u8>),
    LibP2PTransportError(Option<libp2p::Multiaddr>),
    LibP2PStorageError(KadStorageError),
    LibP2PGetRecordError(kad::GetRecordError),
    LibP2PBootstrapError(kad::BootstrapError),
    LibP2PPutRecordError(kad::PutRecordError),
    LibP2PAddProviderError(kad::AddProviderError),
    LibP2PGetProvidersError(kad::GetProvidersError),
    NotConnected,
    NoKnownPeers,
}

impl std::error::Error for DHTError {}
impl fmt::Display for DHTError {
    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            DHTError::NotConnected => write!(fmt, "DHT not running"),
            DHTError::NoKnownPeers => write!(fmt, "no known peers"),
            DHTError::LibP2PTransportError(e) => write!(fmt, "{:#?}", e),
            DHTError::LibP2PStorageError(e) => write!(fmt, "{:#?}", e),
            DHTError::LibP2PGetRecordError(e) => write!(fmt, "{:#?}", e),
            DHTError::LibP2PPutRecordError(e) => write!(fmt, "{:#?}", e),
            DHTError::LibP2PBootstrapError(e) => write!(fmt, "{:#?}", e),
            DHTError::LibP2PAddProviderError(e) => write!(fmt, "{:#?}", e),
            DHTError::LibP2PGetProvidersError(e) => write!(fmt, "{:#?}", e),
            DHTError::IO(k) => write!(fmt, "{:#?}", k),
            DHTError::Error(m) => write!(fmt, "{:#?}", m),
            DHTError::ValidationError(_) => write!(fmt, "validation error"),
        }
    }
}

impl From<ChannelError> for DHTError {
    fn from(e: ChannelError) -> Self {
        match e {
            ChannelError::RecvError => DHTError::Error("RecvError".into()),
            ChannelError::SendError => DHTError::Error("SendError".into()),
        }
    }
}

impl From<anyhow::Error> for DHTError {
    fn from(e: anyhow::Error) -> Self {
        DHTError::Error(e.to_string())
    }
}

impl From<io::Error> for DHTError {
    fn from(e: io::Error) -> Self {
        DHTError::IO(e.kind())
    }
}

impl<TErr> From<TransportError<TErr>> for DHTError {
    fn from(e: TransportError<TErr>) -> Self {
        match e {
            TransportError::MultiaddrNotSupported(addr) => {
                DHTError::LibP2PTransportError(Some(addr))
            }
            TransportError::Other(_) => DHTError::LibP2PTransportError(None),
        }
    }
}

impl From<KadStorageError> for DHTError {
    fn from(e: KadStorageError) -> Self {
        DHTError::LibP2PStorageError(e)
    }
}

impl From<kad::GetRecordError> for DHTError {
    fn from(e: kad::GetRecordError) -> Self {
        DHTError::LibP2PGetRecordError(e)
    }
}

impl From<kad::PutRecordError> for DHTError {
    fn from(e: kad::PutRecordError) -> Self {
        DHTError::LibP2PPutRecordError(e)
    }
}

impl From<kad::BootstrapError> for DHTError {
    fn from(e: kad::BootstrapError) -> Self {
        DHTError::LibP2PBootstrapError(e)
    }
}

impl From<kad::AddProviderError> for DHTError {
    fn from(e: kad::AddProviderError) -> Self {
        DHTError::LibP2PAddProviderError(e)
    }
}

impl From<kad::GetProvidersError> for DHTError {
    fn from(e: kad::GetProvidersError) -> Self {
        DHTError::LibP2PGetProvidersError(e)
    }
}