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}