Skip to main content

tuwunel_core/utils/stream/
ignore.rs

1use futures::{Stream, StreamExt, TryStream, future::ready};
2
3use crate::{Error, Result, utils::stream::TryExpect};
4
5pub trait TryIgnore<Item>
6where
7	Item: Send,
8	Self: Send + Sized,
9{
10	fn ignore_err(self) -> impl Stream<Item = Item> + Send;
11
12	fn ignore_ok(self) -> impl Stream<Item = Error> + Send;
13}
14
15impl<Item, S> TryIgnore<Item> for S
16where
17	S: Stream<Item = Result<Item>> + Send + TryStream + TryExpect<Item>,
18	Item: Send,
19	Self: Send + Sized,
20{
21	#[cfg(debug_assertions)]
22	#[inline]
23	fn ignore_err(self: S) -> impl Stream<Item = Item> + Send { self.expect_ok() }
24
25	#[cfg(not(debug_assertions))]
26	#[inline]
27	fn ignore_err(self: S) -> impl Stream<Item = Item> + Send {
28		self.filter_map(|res| ready(res.ok()))
29	}
30
31	#[inline]
32	fn ignore_ok(self: S) -> impl Stream<Item = Error> + Send {
33		self.filter_map(|res| ready(res.err()))
34	}
35}