1 use std::sync::{Mutex, MutexGuard};
2 
3 wit_bindgen::generate!({
4     world: "test-reactor",
5     path: "../wasi/src/p2/wit",
6     generate_all,
7 });
8 
9 struct T;
10 
11 export!(T);
12 
state() -> MutexGuard<'static, Vec<String>>13 fn state() -> MutexGuard<'static, Vec<String>> {
14     static STATE: Mutex<Vec<String>> = Mutex::new(Vec::new());
15     STATE.lock().unwrap()
16 }
17 
18 impl Guest for T {
add_strings(ss: Vec<String>) -> u3219     fn add_strings(ss: Vec<String>) -> u32 {
20         let mut state = state();
21         for s in ss {
22             match s.split_once("$") {
23                 Some((prefix, var)) if prefix.is_empty() => match std::env::var(var) {
24                     Ok(val) => state.push(val),
25                     Err(_) => state.push("undefined".to_owned()),
26                 },
27                 _ => state.push(s),
28             }
29         }
30         state.len() as u32
31     }
get_strings() -> Vec<String>32     fn get_strings() -> Vec<String> {
33         state().clone()
34     }
35 
write_strings_to(o: OutputStream) -> Result<(), ()>36     fn write_strings_to(o: OutputStream) -> Result<(), ()> {
37         let pollable = o.subscribe();
38         for s in state().iter() {
39             let mut out = s.as_bytes();
40             while !out.is_empty() {
41                 pollable.block();
42                 let n = match o.check_write() {
43                     Ok(n) => n,
44                     Err(_) => return Err(()),
45                 };
46 
47                 let len = (n as usize).min(out.len());
48                 match o.write(&out[..len]) {
49                     Ok(_) => out = &out[len..],
50                     Err(_) => return Err(()),
51                 }
52             }
53         }
54 
55         match o.flush() {
56             Ok(_) => {}
57             Err(_) => return Err(()),
58         }
59         pollable.block();
60         match o.check_write() {
61             Ok(_) => {}
62             Err(_) => return Err(()),
63         }
64 
65         Ok(())
66     }
pass_an_imported_record(stat: wasi::filesystem::types::DescriptorStat) -> String67     fn pass_an_imported_record(stat: wasi::filesystem::types::DescriptorStat) -> String {
68         format!("{stat:?}")
69     }
70 }
71 
72 // Technically this should not be here for a reactor, but given the current
73 // framework for tests it's required since this file is built as a `bin`
main()74 fn main() {}
75