rocketjson_data/error/
error_util.rs

1use super::{ApiErrors, ApiError};
2
3///Easier way to create enum from supported errors
4///- Example
5///```
6///use rocketjson::{ApiResponseErr, error::{ApiErrors, ApiErrorsCreate}};
7///
8///ApiResponseErr::err(ApiErrors::to_rocketjson_error(error))
9///```
10pub trait ApiErrorsCreate<TIN> {
11    fn to_rocketjson_error(error: TIN) -> ApiErrors;
12}
13
14impl ApiErrorsCreate<ApiError> for ApiErrors {
15    fn to_rocketjson_error(error: ApiError) -> ApiErrors {
16        ApiErrors::ApiError(error)
17    }
18}
19
20impl<T> ApiErrorsCreate<T> for ApiErrors
21    where T: std::error::Error + Send + Sync + 'static {
22    fn to_rocketjson_error(error: T) -> ApiErrors {
23        ApiErrors::AnyError(anyhow::Error::new(error))
24    }
25}
26
27///To forward Errors as [`ApiResponseErr`] [`rjtry`] can be used.
28///# Requirements
29///the trait [`ApiErrorsCreate`] has to be in scope.
30///# Example
31///```
32///use rocketjson::{ApiResponseErr, rjtry, error::ApiErrorsCreate};
33///
34///pub async fn db_get_users() -> Result<String, diesel::result::Error> {
35///    ...
36///}
37///
38///pub async fn is_admin() -> ApiResponseErr<bool> {
39///    let user = rjtry!(db_get_users().await);
40///    ApiResponseErr::ok(rocket::http::Status::Ok, user == "admin")
41///}
42///```
43#[macro_export]
44macro_rules! rjtry {
45    ($i:expr) => (
46        match $i {
47            Result::Ok(val) => val,
48            Result::Err(err) => {
49                return rocketjson::ApiResponseErr::<_>::err(rocketjson::error::ApiErrors::to_rocketjson_error(err));
50            }
51        }
52    )
53}