Path: blob/main/crates/test-programs/src/bin/api_reactor.rs
1693 views
use std::sync::{Mutex, MutexGuard};12wit_bindgen::generate!({3world: "test-reactor",4path: "../wasi/src/p2/wit",5generate_all,6});78struct T;910export!(T);1112fn state() -> MutexGuard<'static, Vec<String>> {13static STATE: Mutex<Vec<String>> = Mutex::new(Vec::new());14STATE.lock().unwrap()15}1617impl Guest for T {18fn add_strings(ss: Vec<String>) -> u32 {19let mut state = state();20for s in ss {21match s.split_once("$") {22Some((prefix, var)) if prefix.is_empty() => match std::env::var(var) {23Ok(val) => state.push(val),24Err(_) => state.push("undefined".to_owned()),25},26_ => state.push(s),27}28}29state.len() as u3230}31fn get_strings() -> Vec<String> {32state().clone()33}3435fn write_strings_to(o: OutputStream) -> Result<(), ()> {36let pollable = o.subscribe();37for s in state().iter() {38let mut out = s.as_bytes();39while !out.is_empty() {40pollable.block();41let n = match o.check_write() {42Ok(n) => n,43Err(_) => return Err(()),44};4546let len = (n as usize).min(out.len());47match o.write(&out[..len]) {48Ok(_) => out = &out[len..],49Err(_) => return Err(()),50}51}52}5354match o.flush() {55Ok(_) => {}56Err(_) => return Err(()),57}58pollable.block();59match o.check_write() {60Ok(_) => {}61Err(_) => return Err(()),62}6364Ok(())65}66fn pass_an_imported_record(stat: wasi::filesystem::types::DescriptorStat) -> String {67format!("{stat:?}")68}69}7071// Technically this should not be here for a reactor, but given the current72// framework for tests it's required since this file is built as a `bin`73fn main() {}747576