axum_resp_result/convert/
mod.rs

1pub mod from_request;
2use std::{convert::Infallible, future::Future};
3
4use crate::{RespError, RespResult};
5
6/// convert into [`RespResult`](crate::RespResult)
7pub trait IntoRespResult<T, E: RespError> {
8    fn into_rresult(self) -> RespResult<T, E>;
9}
10
11/// convert into [`RespResult`](crate::RespResult) with provide error
12pub trait IntoRespResultWithErr<T, E: RespError> {
13    fn into_with_err<Et: Into<E>>(self, err: Et) -> RespResult<T, E>;
14}
15
16impl<E, T> IntoRespResult<T, E> for Result<T, E>
17where
18    E: RespError,
19{
20    #[inline]
21    fn into_rresult(self) -> RespResult<T, E> {
22        RespResult::from(self)
23    }
24}
25
26impl<E, T> IntoRespResult<T, E> for RespResult<T, E>
27where
28    E: RespError,
29{
30    #[inline]
31    fn into_rresult(self) -> RespResult<T, E> {
32        self
33    }
34}
35
36impl<T, E> IntoRespResultWithErr<T, E> for Option<T>
37where
38    E: RespError,
39{
40    #[inline]
41    fn into_with_err<Et: Into<E>>(self, err: Et) -> RespResult<T, E> {
42        self.ok_or(err).map_err(Into::into).into_rresult()
43    }
44}
45
46pub trait Fallible {
47    type Success;
48    type Failure;
49
50    fn to_result(self) -> Result<Self::Success, Self::Failure>;
51}
52
53impl<T, R> Fallible for Result<T, R> {
54    type Success = T;
55
56    type Failure = R;
57
58    fn to_result(self) -> Result<Self::Success, Self::Failure> {
59        self
60    }
61}
62
63impl<T, R> Fallible for RespResult<T, R> {
64    type Success = T;
65
66    type Failure = R;
67
68    fn to_result(self) -> Result<<Self as Fallible>::Success, Self::Failure> {
69        match self {
70            RespResult::Success(suc) => Ok(suc),
71            RespResult::Err(err) => Err(err),
72        }
73    }
74}
75
76impl Fallible for () {
77    type Success = ();
78
79    type Failure = Infallible;
80
81    fn to_result(self) -> Result<Self::Success, Self::Failure> {
82        Ok(self)
83    }
84}
85
86#[inline]
87/// receive a [Future](core::future::Future) applying it immediately, then convent the result into [RespResult](crate::RespResult)
88pub async fn resp_try<Fut, T, E>(future: Fut) -> RespResult<T, E>
89where
90    Fut: Future,
91    Fut::Output: IntoRespResult<T, E>,
92    E: RespError,
93{
94    future.await.into_rresult()
95}