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