| 1 | use async_stream::try_stream; |
| 2 | |
| 3 | use futures_core::stream::Stream; |
| 4 | use futures_util::stream::StreamExt; |
| 5 | |
| 6 | #[tokio::test ] |
| 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 ] |
| 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 ] |
| 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 ] |
| 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)] |
| 83 | fn issue_65() -> impl Stream<Item = Result<u32, ()>> { |
| 84 | try_stream! { |
| 85 | yield Err(())?; |
| 86 | } |
| 87 | } |
| 88 | |