mirror of
https://github.com/actix/examples
synced 2024-11-28 16:32:39 +01:00
54 lines
1.8 KiB
Rust
54 lines
1.8 KiB
Rust
|
use actix_web::{error::ResponseError, HttpResponse};
|
||
|
use std::convert::From;
|
||
|
use diesel::result::{DatabaseErrorKind, Error};
|
||
|
use uuid::ParseError;
|
||
|
|
||
|
|
||
|
#[derive(Fail, Debug)]
|
||
|
pub enum ServiceError {
|
||
|
#[fail(display = "Internal Server Error")]
|
||
|
InternalServerError,
|
||
|
|
||
|
#[fail(display = "BadRequest: {}", _0)]
|
||
|
BadRequest(String),
|
||
|
|
||
|
#[fail(display = "Unauthorized")]
|
||
|
Unauthorized,
|
||
|
}
|
||
|
|
||
|
// impl ResponseError trait allows to convert our errors into http responses with appropriate data
|
||
|
impl ResponseError for ServiceError {
|
||
|
fn error_response(&self) -> HttpResponse {
|
||
|
match *self {
|
||
|
ServiceError::InternalServerError => HttpResponse::InternalServerError().json("Internal Server Error, Please try later"),
|
||
|
ServiceError::BadRequest(ref message) => HttpResponse::BadRequest().json(message),
|
||
|
ServiceError::Unauthorized => HttpResponse::Unauthorized().json("Unauthorized")
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// we can return early in our handlers if UUID provided by the user is not valid
|
||
|
// and provide a custom message
|
||
|
impl From<ParseError> for ServiceError {
|
||
|
fn from(_: ParseError) -> ServiceError {
|
||
|
ServiceError::BadRequest("Invalid UUID".into())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl From<Error> for ServiceError {
|
||
|
fn from(error: Error) -> ServiceError {
|
||
|
// Right now we just care about UniqueViolation from diesel
|
||
|
// But this would be helpful to easily map errors as our app grows
|
||
|
match error {
|
||
|
Error::DatabaseError(kind, info) => {
|
||
|
if let DatabaseErrorKind::UniqueViolation = kind {
|
||
|
let message = info.details().unwrap_or_else(|| info.message()).to_string();
|
||
|
return ServiceError::BadRequest(message);
|
||
|
}
|
||
|
ServiceError::InternalServerError
|
||
|
}
|
||
|
_ => ServiceError::InternalServerError
|
||
|
}
|
||
|
}
|
||
|
}
|