1
0
Fork 0
mirror of https://github.com/actix/actix-web.git synced 2024-09-20 18:40:08 +00:00
actix-web/actix-web/src/error/error.rs

75 lines
2.1 KiB
Rust
Raw Normal View History

2021-06-17 16:57:58 +00:00
use std::{error::Error as StdError, fmt};
2021-12-04 19:40:47 +00:00
use actix_http::{body::BoxBody, Response};
2021-06-17 16:57:58 +00:00
use crate::{HttpResponse, ResponseError};
2022-01-23 23:26:35 +00:00
/// General purpose Actix Web error.
2021-06-17 16:57:58 +00:00
///
2022-01-23 23:26:35 +00:00
/// An Actix Web error is used to carry errors from `std::error` through actix in a convenient way.
/// It can be created through converting errors with `into()`.
2021-06-17 16:57:58 +00:00
///
2022-01-23 23:26:35 +00:00
/// Whenever it is created from an external object a response error is created for it that can be
/// used to create an HTTP response from it this means that if you have access to an actix `Error`
/// you can always get a `ResponseError` reference from it.
2021-06-17 16:57:58 +00:00
pub struct Error {
cause: Box<dyn ResponseError>,
}
impl Error {
/// Returns the reference to the underlying `ResponseError`.
pub fn as_response_error(&self) -> &dyn ResponseError {
self.cause.as_ref()
}
/// Similar to `as_response_error` but downcasts.
pub fn as_error<T: ResponseError + 'static>(&self) -> Option<&T> {
<dyn ResponseError>::downcast_ref(self.cause.as_ref())
}
/// Shortcut for creating an `HttpResponse`.
pub fn error_response(&self) -> HttpResponse {
self.cause.error_response()
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(&self.cause, f)
}
}
impl fmt::Debug for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", &self.cause)
}
}
impl StdError for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
// TODO: populate if replacement for Box<dyn Error> is found
None
}
}
impl From<std::convert::Infallible> for Error {
fn from(val: std::convert::Infallible) -> Self {
match val {}
}
}
/// `Error` for any error that implements `ResponseError`
impl<T: ResponseError + 'static> From<T> for Error {
fn from(err: T) -> Error {
Error {
cause: Box::new(err),
}
}
}
2021-12-04 19:40:47 +00:00
impl From<Error> for Response<BoxBody> {
fn from(err: Error) -> Response<BoxBody> {
2021-06-17 16:57:58 +00:00
err.error_response().into()
}
}