aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBrooks J Rady <b.j.rady@gmail.com>2020-12-29 12:49:35 +0000
committerBrooks J Rady <b.j.rady@gmail.com>2020-12-29 12:49:35 +0000
commit0049b26bf8610c96d0a340c110c71a0d08507032 (patch)
treec40eb69f91e9f61b7dfbe215bc77c7fa3598ed72 /src
parentFully Working WebAssembly Loading! (diff)
downloadsl0ppij-0049b26bf8610c96d0a340c110c71a0d08507032.tar.gz
sl0ppij-0049b26bf8610c96d0a340c110c71a0d08507032.tar.xz
sl0ppij-0049b26bf8610c96d0a340c110c71a0d08507032.zip
Move some wasm code to it's own module
Diffstat (limited to 'src')
-rw-r--r--src/main.rs51
-rw-r--r--src/wasm_vm.rs41
2 files changed, 50 insertions, 42 deletions
diff --git a/src/main.rs b/src/main.rs
index 787a670a..7b9c67f8 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -12,6 +12,8 @@ mod screen;
mod tab;
mod terminal_pane;
mod utils;
+#[cfg(feature = "wasm-wip")]
+mod wasm_vm;
use std::io::Write;
use std::os::unix::net::UnixStream;
@@ -387,12 +389,10 @@ pub fn start(mut os_input: Box<dyn OsApi>, opts: Opt) {
.spawn(move || {
// TODO: Clone shared state here
move || -> Result<(), Box<dyn std::error::Error>> {
- use std::{
- io,
- process::{Command, Stdio},
- };
- use wasmer::{Exports, Function, Instance, Module, Store, Value};
- use wasmer_wasi::{Pipe, WasiEnv, WasiState};
+ use crate::wasm_vm::{mosaic_imports, wasi_stdout};
+ use std::io;
+ use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value};
+ use wasmer_wasi::{Pipe, WasiState};
let store = Store::default();
@@ -419,15 +419,9 @@ pub fn start(mut os_input: Box<dyn OsApi>, opts: Opt) {
.stdout(Box::new(output))
.finalize()?;
- let mut import_object = wasi_env.import_object(&module)?;
- // FIXME: Upstream an `ImportObject` merge method
- let mut host_exports = Exports::new();
- host_exports.insert(
- "host_open_file",
- Function::new_native_with_env(&store, wasi_env.clone(), host_open_file),
- );
- import_object.register("mosaic", host_exports);
- let instance = Instance::new(&module, &import_object)?;
+ let wasi = wasi_env.import_object(&module)?;
+ let mosaic = mosaic_imports(&store, &wasi_env);
+ let instance = Instance::new(&module, &mosaic.chain_back(wasi))?;
let start = instance.exports.get_function("_start")?;
let handle_key = instance.exports.get_function("handle_key")?;
@@ -464,33 +458,6 @@ pub fn start(mut os_input: Box<dyn OsApi>, opts: Opt) {
} */
break;
}
-
- fn host_open_file(wasi_env: &WasiEnv) {
- Command::new("xdg-open")
- .arg(format!(
- "./{}",
- wasi_stdout(wasi_env).lines().next().unwrap()
- ))
- .stderr(Stdio::null())
- .spawn()
- .unwrap();
- }
-
- // FIXME: Unwrap city
- fn wasi_stdout(wasi_env: &WasiEnv) -> String {
- let mut state = wasi_env.state();
- let wasi_file = state.fs.stdout_mut().unwrap().as_mut().unwrap();
- let mut buf = String::new();
- wasi_file.read_to_string(&mut buf).unwrap();
- buf
- }
-
- fn _wasi_write_string(wasi_env: &WasiEnv, buf: &str) {
- let mut state = wasi_env.state();
- let wasi_file = state.fs.stdin_mut().unwrap().as_mut().unwrap();
- writeln!(wasi_file, "{}\r", buf).unwrap();
- }
-
debug_log_to_file("WASM module loaded and exited cleanly :)".to_string())?;
Ok(())
}()
diff --git a/src/wasm_vm.rs b/src/wasm_vm.rs
new file mode 100644
index 00000000..334ad0b1
--- /dev/null
+++ b/src/wasm_vm.rs
@@ -0,0 +1,41 @@
+use std::process::{Command, Stdio};
+use wasmer::{imports, Function, ImportObject, Store};
+use wasmer_wasi::WasiEnv;
+
+// Plugin API -----------------------------------------------------------------
+
+pub fn mosaic_imports(store: &Store, wasi_env: &WasiEnv) -> ImportObject {
+ imports! {
+ "mosaic" => {
+ "host_open_file" => Function::new_native_with_env(store, wasi_env.clone(), host_open_file)
+ }
+ }
+}
+
+fn host_open_file(wasi_env: &WasiEnv) {
+ Command::new("xdg-open")
+ .arg(format!(
+ "./{}",
+ wasi_stdout(wasi_env).lines().next().unwrap()
+ ))
+ .stderr(Stdio::null())
+ .spawn()
+ .unwrap();
+}
+
+// Helper Functions -----------------------------------------------------------
+
+// FIXME: Unwrap city
+pub fn wasi_stdout(wasi_env: &WasiEnv) -> String {
+ let mut state = wasi_env.state();
+ let wasi_file = state.fs.stdout_mut().unwrap().as_mut().unwrap();
+ let mut buf = String::new();
+ wasi_file.read_to_string(&mut buf).unwrap();
+ buf
+}
+
+pub fn _wasi_write_string(wasi_env: &WasiEnv, buf: &str) {
+ let mut state = wasi_env.state();
+ let wasi_file = state.fs.stdin_mut().unwrap().as_mut().unwrap();
+ writeln!(wasi_file, "{}\r", buf).unwrap();
+}