use core::error::Error;
use ts_error::{IntoReport, LogError};
use crate::error_response::ErrorResponse;
pub trait IntoErrorResponse<T> {
#[track_caller]
fn internal_server_error(self) -> Result<T, ErrorResponse>;
#[track_caller]
fn not_found(self) -> Result<T, ErrorResponse>;
}
impl<T, E: Error + 'static> IntoErrorResponse<T> for Result<T, E> {
#[track_caller]
fn internal_server_error(self) -> Result<T, ErrorResponse> {
match self.into_report().log_err() {
Ok(v) => Ok(v),
Err(_) => Err(ErrorResponse::InternalServerError),
}
}
#[track_caller]
fn not_found(self) -> Result<T, ErrorResponse> {
match self {
Ok(v) => Ok(v),
Err(_) => Err(ErrorResponse::NotFound),
}
}
}
impl<T> IntoErrorResponse<T> for Option<T> {
#[track_caller]
fn internal_server_error(self) -> Result<T, ErrorResponse> {
match self.log_err() {
Some(v) => Ok(v),
None => Err(ErrorResponse::InternalServerError),
}
}
#[track_caller]
fn not_found(self) -> Result<T, ErrorResponse> {
match self {
Some(v) => Ok(v),
None => Err(ErrorResponse::NotFound),
}
}
}