tuwunel_core/utils/result/
flat_ok.rs1use super::Result;
2
3pub trait FlatOk<T> {
4 fn flat_ok(self) -> Option<T>;
6
7 fn flat_ok_or<E>(self, err: E) -> Result<T, E>;
9
10 fn flat_ok_or_else<E, F: FnOnce() -> E>(self, err: F) -> Result<T, E>;
12}
13
14impl<T, E> FlatOk<T> for Option<Result<T, E>> {
15 #[inline]
16 fn flat_ok(self) -> Option<T> { self.transpose().ok().flatten() }
17
18 #[inline]
19 fn flat_ok_or<Ep>(self, err: Ep) -> Result<T, Ep> { self.flat_ok().ok_or(err) }
20
21 #[inline]
22 fn flat_ok_or_else<Ep, F: FnOnce() -> Ep>(self, err: F) -> Result<T, Ep> {
23 self.flat_ok().ok_or_else(err)
24 }
25}
26
27impl<T, E> FlatOk<T> for Result<Option<T>, E> {
28 #[inline]
29 fn flat_ok(self) -> Option<T> { self.ok().flatten() }
30
31 #[inline]
32 fn flat_ok_or<Ep>(self, err: Ep) -> Result<T, Ep> { self.flat_ok().ok_or(err) }
33
34 #[inline]
35 fn flat_ok_or_else<Ep, F: FnOnce() -> Ep>(self, err: F) -> Result<T, Ep> {
36 self.flat_ok().ok_or_else(err)
37 }
38}