| //! Error types for the `Buffer` middleware. |
| |
| use crate::BoxError; |
| use std::{fmt, sync::Arc}; |
| |
| /// An error produced by a [`Service`] wrapped by a [`Buffer`] |
| /// |
| /// [`Service`]: crate::Service |
| /// [`Buffer`]: crate::buffer::Buffer |
| #[derive(Debug)] |
| pub struct ServiceError { |
| inner: Arc<BoxError>, |
| } |
| |
| /// An error produced when the a buffer's worker closes unexpectedly. |
| pub struct Closed { |
| _p: (), |
| } |
| |
| // ===== impl ServiceError ===== |
| |
| impl ServiceError { |
| pub(crate) fn new(inner: BoxError) -> ServiceError { |
| let inner = Arc::new(inner); |
| ServiceError { inner } |
| } |
| |
| // Private to avoid exposing `Clone` trait as part of the public API |
| pub(crate) fn clone(&self) -> ServiceError { |
| ServiceError { |
| inner: self.inner.clone(), |
| } |
| } |
| } |
| |
| impl fmt::Display for ServiceError { |
| fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { |
| write!(fmt, "buffered service failed: {}", self.inner) |
| } |
| } |
| |
| impl std::error::Error for ServiceError { |
| fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { |
| Some(&**self.inner) |
| } |
| } |
| |
| // ===== impl Closed ===== |
| |
| impl Closed { |
| pub(crate) fn new() -> Self { |
| Closed { _p: () } |
| } |
| } |
| |
| impl fmt::Debug for Closed { |
| fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { |
| fmt.debug_tuple("Closed").finish() |
| } |
| } |
| |
| impl fmt::Display for Closed { |
| fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { |
| fmt.write_str("buffer's worker closed unexpectedly") |
| } |
| } |
| |
| impl std::error::Error for Closed {} |