Skip to main content

tuwunel_core/utils/result/
flat_ok.rs

1use super::Result;
2
3pub trait FlatOk<T> {
4	/// Equivalent to .transpose().ok().flatten()
5	fn flat_ok(self) -> Option<T>;
6
7	/// Equivalent to .transpose().ok().flatten().ok_or(...)
8	fn flat_ok_or<E>(self, err: E) -> Result<T, E>;
9
10	/// Equivalent to .transpose().ok().flatten().ok_or_else(...)
11	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}