forked from 2sys/shoutdotdev
33 lines
1 KiB
Rust
33 lines
1 KiB
Rust
use anyhow::Error;
|
|
use axum::http::StatusCode;
|
|
use axum::response::{IntoResponse, Response};
|
|
|
|
// Use anyhow, define error and enable '?'
|
|
// For a simplified example of using anyhow in axum check /examples/anyhow-error-response
|
|
#[derive(Debug)]
|
|
pub enum AppError {
|
|
InternalServerError(Error),
|
|
}
|
|
|
|
// Tell axum how to convert `AppError` into a response.
|
|
impl IntoResponse for AppError {
|
|
fn into_response(self) -> Response {
|
|
match self {
|
|
Self::InternalServerError(err) => {
|
|
tracing::error!("Application error: {:#}", err);
|
|
(StatusCode::INTERNAL_SERVER_ERROR, "Something went wrong").into_response()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// This enables using `?` on functions that return `Result<_, anyhow::Error>` to turn them into
|
|
// `Result<_, AppError>`. That way you don't need to do that manually.
|
|
impl<E> From<E> for AppError
|
|
where
|
|
E: Into<anyhow::Error>,
|
|
{
|
|
fn from(err: E) -> Self {
|
|
Self::InternalServerError(Into::<anyhow::Error>::into(err))
|
|
}
|
|
}
|