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