mod gyehoek; mod internal; mod types; use std::io; use std::io::Read; use clio::*; use clap::Parser; use wasmtime::*; /// A Wasm runtime for Gyehoek scheme. #[derive(Parser, Debug)] #[command(name = "gyehoek", version, about, long_about = None)] struct Args { /// Path to Wasm binary or textual source #[clap(value_parser)] wasm: Input, } fn read (mut rdr : R) -> io::Result> { let mut buf = vec! []; rdr.read_to_end (&mut buf)?; Ok (buf) } fn get_config () -> Config { let mut cfg = Config::new (); cfg.wasm_reference_types (true); cfg.wasm_function_references (true); cfg.wasm_tail_call (true); cfg.wasm_gc (true); cfg } fn link_primitives (linker : &mut Linker) -> wasmtime::Result<()> { linker.func_wrap ("gyehoek", "write", gyehoek::write)?; linker.func_wrap ("gyehoek", "truthy?", gyehoek::truthy_p)?; Ok (()) } pub fn main () -> wasmtime::Result<()> { let args = Args::parse (); let wasm_config = get_config (); let engine = Engine::new (&wasm_config)?; let module = Module::new (&engine, read (args.wasm)?)?; let mut linker = Linker::new (&engine); link_primitives (&mut linker)?; let mut store : Store = Store::new (&engine, 4); let instance = linker.instantiate (&mut store, &module)?; let main = instance.get_typed_func::<(),()> (&mut store, "main")?; main.call (&mut store, ())?; Ok (()) }