1 mod bindings {
2     wit_bindgen::generate!({
3         path: "../misc/component-async-tests/wit",
4         world: "backpressure-caller",
5     });
6 
7     use super::Component;
8     export!(Component);
9 }
10 
11 use {
12     bindings::{
13         exports::local::local::run::Guest,
14         local::local::{backpressure, run},
15     },
16     futures::future,
17     std::{
18         future::Future,
19         pin::Pin,
20         task::{Context, Poll},
21     },
22 };
23 
24 struct Component;
25 
26 impl Guest for Component {
27     async fn run() {
28         backpressure::set_backpressure(true);
29 
30         let mut a = Some(Box::pin(run::run()));
31         let mut b = Some(Box::pin(run::run()));
32         let mut c = Some(Box::pin(run::run()));
33 
34         let mut backpressure_is_set = true;
35         future::poll_fn(move |cx| {
36             let a_ready = is_ready(cx, &mut a);
37             let b_ready = is_ready(cx, &mut b);
38             let c_ready = is_ready(cx, &mut c);
39 
40             if backpressure_is_set {
41                 assert!(!a_ready);
42                 assert!(!b_ready);
43                 assert!(!c_ready);
44 
45                 backpressure::set_backpressure(false);
46                 backpressure_is_set = false;
47 
48                 Poll::Pending
49             } else if a_ready && b_ready && c_ready {
50                 Poll::Ready(())
51             } else {
52                 Poll::Pending
53             }
54         })
55         .await
56     }
57 }
58 
59 fn is_ready(cx: &mut Context, fut: &mut Option<Pin<Box<impl Future<Output = ()>>>>) -> bool {
60     if let Some(v) = fut.as_mut() {
61         if v.as_mut().poll(cx).is_ready() {
62             *fut = None;
63             true
64         } else {
65             false
66         }
67     } else {
68         true
69     }
70 }
71 
72 // Unused function; required since this file is built as a `bin`:
73 fn main() {}
74