Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/test-programs/src/bin/api_reactor.rs
1693 views
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
76