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