axum_resp_result/convert/
mod.rs1pub mod from_request;
2use std::{convert::Infallible, future::Future};
3
4use crate::{RespError, RespResult};
5
6pub trait IntoRespResult<T, E: RespError> {
8 fn into_rresult(self) -> RespResult<T, E>;
9}
10
11pub 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]
87pub 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}