1 mod bindings {
2     wit_bindgen::generate!({
3         path: "../misc/component-async-tests/wit",
4         world: "transmit-callee",
5     });
6 
7     use super::Component;
8     export!(Component);
9 }
10 
11 use {
12     bindings::{
13         exports::local::local::transmit::{Control, Guest},
14         wit_future, wit_stream,
15     },
16     std::future::IntoFuture,
17     wit_bindgen::{FutureReader, StreamReader, StreamResult},
18 };
19 
20 struct Component;
21 
22 impl Guest for Component {
exchange( mut control_rx: StreamReader<Control>, mut caller_stream_rx: StreamReader<String>, caller_future_rx1: FutureReader<String>, caller_future_rx2: FutureReader<String>, ) -> ( StreamReader<String>, FutureReader<String>, FutureReader<String>, )23     async fn exchange(
24         mut control_rx: StreamReader<Control>,
25         mut caller_stream_rx: StreamReader<String>,
26         caller_future_rx1: FutureReader<String>,
27         caller_future_rx2: FutureReader<String>,
28     ) -> (
29         StreamReader<String>,
30         FutureReader<String>,
31         FutureReader<String>,
32     ) {
33         let (mut callee_stream_tx, callee_stream_rx) = wit_stream::new();
34         let (callee_future_tx1, callee_future_rx1) = wit_future::new(|| todo!());
35         let (callee_future_tx2, callee_future_rx2) = wit_future::new(|| String::new());
36 
37         wit_bindgen::spawn(async move {
38             let mut caller_future_rx1 = Some(caller_future_rx1);
39             let mut callee_future_tx1 = Some(callee_future_tx1);
40 
41             while let Some(message) = control_rx.next().await {
42                 match message {
43                     Control::ReadStream(value) => {
44                         assert_eq!(caller_stream_rx.next().await, Some(value));
45                     }
46                     Control::ReadStreamZero => {
47                         assert_eq!(
48                             caller_stream_rx.read(Vec::new()).await.0,
49                             StreamResult::Complete(0)
50                         );
51                     }
52                     Control::ReadFuture(value) => {
53                         assert_eq!(caller_future_rx1.take().unwrap().into_future().await, value);
54                     }
55                     Control::WriteStream(value) => {
56                         assert!(callee_stream_tx.write_one(value).await.is_none());
57                     }
58                     Control::WriteStreamZero => {
59                         assert_eq!(
60                             callee_stream_tx.write(Vec::new()).await.0,
61                             StreamResult::Complete(0)
62                         );
63                     }
64                     Control::WriteFuture(value) => {
65                         callee_future_tx1
66                             .take()
67                             .unwrap()
68                             .write(value)
69                             .await
70                             .unwrap();
71                     }
72                 }
73             }
74 
75             drop((caller_future_rx2, callee_future_tx2));
76         });
77 
78         (callee_stream_rx, callee_future_rx1, callee_future_rx2)
79     }
80 }
81 
82 // Unused function; required since this file is built as a `bin`:
main()83 fn main() {}
84