diff --git a/protocols/request-response/src/lib.rs b/protocols/request-response/src/lib.rs index dae0c11cba1b..35f6ad263d1c 100644 --- a/protocols/request-response/src/lib.rs +++ b/protocols/request-response/src/lib.rs @@ -93,6 +93,7 @@ use std::{ sync::{atomic::AtomicU64, Arc}, task::{Context, Poll} }; +use std::fmt::Formatter; /// An inbound request or response. #[derive(Debug)] @@ -181,6 +182,19 @@ pub enum OutboundFailure { UnsupportedProtocols, } +impl fmt::Display for OutboundFailure { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + OutboundFailure::DialFailure => write!(f, "failed to dial the requested peer"), + OutboundFailure::Timeout => write!(f, "timeout while waiting for a response"), + OutboundFailure::ConnectionClosed => write!(f, "connection was closed before a response was received"), + OutboundFailure::UnsupportedProtocols => write!(f, "the remote supports none of the requested protocols") + } + } +} + +impl std::error::Error for OutboundFailure {} + /// Possible failures occurring in the context of receiving an /// inbound request and sending a response. #[derive(Debug, Clone, PartialEq)] @@ -201,6 +215,19 @@ pub enum InboundFailure { ResponseOmission, } +impl fmt::Display for InboundFailure { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + InboundFailure::Timeout => write!(f, "timeout while receiving request or sending response"), + InboundFailure::ConnectionClosed => write!(f, "connection was closed before a response could be sent"), + InboundFailure::UnsupportedProtocols => write!(f, "the local peer supports none of the protocols requested by the remote"), + InboundFailure::ResponseOmission => write!(f, "the response channel was dropped without sending a response to the remote") + } + } +} + +impl std::error::Error for InboundFailure {} + /// A channel for sending a response to an inbound request. /// /// See [`RequestResponse::send_response`].