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 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 { 19 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 } 32 fn get_strings() -> Vec<String> { 33 state().clone() 34 } 35 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 } 67 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` 74 fn main() {} 75