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