1 use async_stream::try_stream;
2
3 use futures_core::stream::Stream;
4 use futures_util::stream::StreamExt;
5
6 #[tokio::test]
single_err()7 async fn single_err() {
8 let s = try_stream! {
9 if true {
10 Err("hello")?;
11 } else {
12 yield "world";
13 }
14
15 unreachable!();
16 };
17
18 let values: Vec<_> = s.collect().await;
19 assert_eq!(1, values.len());
20 assert_eq!(Err("hello"), values[0]);
21 }
22
23 #[tokio::test]
yield_then_err()24 async fn yield_then_err() {
25 let s = try_stream! {
26 yield "hello";
27 Err("world")?;
28 unreachable!();
29 };
30
31 let values: Vec<_> = s.collect().await;
32 assert_eq!(2, values.len());
33 assert_eq!(Ok("hello"), values[0]);
34 assert_eq!(Err("world"), values[1]);
35 }
36
37 #[tokio::test]
convert_err()38 async fn convert_err() {
39 struct ErrorA(u8);
40 #[derive(PartialEq, Debug)]
41 struct ErrorB(u8);
42 impl From<ErrorA> for ErrorB {
43 fn from(a: ErrorA) -> ErrorB {
44 ErrorB(a.0)
45 }
46 }
47
48 fn test() -> impl Stream<Item = Result<&'static str, ErrorB>> {
49 try_stream! {
50 if true {
51 Err(ErrorA(1))?;
52 } else {
53 Err(ErrorB(2))?;
54 }
55 yield "unreachable";
56 }
57 }
58
59 let values: Vec<_> = test().collect().await;
60 assert_eq!(1, values.len());
61 assert_eq!(Err(ErrorB(1)), values[0]);
62 }
63
64 #[tokio::test]
multi_try()65 async fn multi_try() {
66 fn test() -> impl Stream<Item = Result<i32, String>> {
67 try_stream! {
68 let a = Ok::<_, String>(Ok::<_, String>(123))??;
69 for _ in 1..10 {
70 yield a;
71 }
72 }
73 }
74 let values: Vec<_> = test().collect().await;
75 assert_eq!(9, values.len());
76 assert_eq!(
77 std::iter::repeat(123).take(9).map(Ok).collect::<Vec<_>>(),
78 values
79 );
80 }
81
82 #[allow(unused)]
issue_65() -> impl Stream<Item = Result<u32, ()>>83 fn issue_65() -> impl Stream<Item = Result<u32, ()>> {
84 try_stream! {
85 yield Err(())?;
86 }
87 }
88