use actix_web::{HttpResponse, ResponseError, http::StatusCode}; use aws_sdk_dynamodb::error::SdkError; use serde::Serialize; use thiserror::Error; pub type Result = core::result::Result; #[derive(Debug, Error)] pub enum Error { #[error("db error: {0}")] DB(#[from] sqlx::Error), #[error("http error: {0}")] Http(#[from] reqwest::Error), #[error("error getting access token")] AccessToken, #[error("unauthorized")] Unauthorized, #[error("jwx error")] Jwx(#[from] jsonwebtoken::errors::Error), #[error("token expired")] TokenExpired, #[error("dynamodb error: {0}")] DynamoDB(String), #[error("item already exists")] AlreadyExists, } impl From> for Error { fn from(err: SdkError) -> Self { Error::DynamoDB(format!("{:?}", err)) } } #[derive(Serialize)] struct ErrorResponse { error: String, } impl ResponseError for Error { fn error_response(&self) -> actix_web::HttpResponse { match self { Error::AccessToken => HttpResponse::BadRequest().finish(), Error::Unauthorized => HttpResponse::Unauthorized().finish(), Error::TokenExpired => HttpResponse::Unauthorized().json(ErrorResponse { error: "token expired".to_string(), }), Error::AlreadyExists => HttpResponse::BadRequest().json(ErrorResponse { error: "item already exists".to_string(), }), _ => HttpResponse::InternalServerError().finish(), } } }