Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/test-programs/src/bin/async_transmit_callee.rs
1693 views
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 {
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`:
83
fn main() {}
84
85