summaryrefslogtreecommitdiff
path: root/crates/cli
diff options
context:
space:
mode:
authorHenry Gressmann <mail@henrygressmann.de>2023-12-04 01:53:09 +0100
committerHenry Gressmann <mail@henrygressmann.de>2023-12-04 01:53:09 +0100
commit829db60c869ea5ec9be37e6fc2ad94c2965d63d4 (patch)
treee007a6885b4d8425d05d09f9d1297c3a599f6c30 /crates/cli
parent1fb52089715631f4edb2abdc592547d0f5121161 (diff)
feat: add wat support to cli
Signed-off-by: Henry Gressmann <mail@henrygressmann.de>
Diffstat (limited to 'crates/cli')
-rw-r--r--crates/cli/Cargo.toml5
-rw-r--r--crates/cli/bin.rs21
-rw-r--r--crates/cli/wat.rs10
3 files changed, 31 insertions, 5 deletions
diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml
index 783ead2..505b025 100644
--- a/crates/cli/Cargo.toml
+++ b/crates/cli/Cargo.toml
@@ -15,3 +15,8 @@ argh="0.1"
color-eyre="0.6"
log="0.4"
pretty_env_logger="0.5"
+wast={version="69.0", optional=true}
+
+[features]
+default=["wast"]
+wast=["dep:wast"]
diff --git a/crates/cli/bin.rs b/crates/cli/bin.rs
index 181b2e1..a067ca8 100644
--- a/crates/cli/bin.rs
+++ b/crates/cli/bin.rs
@@ -3,8 +3,9 @@ use std::str::FromStr;
use argh::FromArgs;
use color_eyre::eyre::Result;
use log::info;
-use tinywasm::{self, WasmValue};
+use tinywasm::{self, Module, WasmValue};
mod util;
+mod wat;
#[derive(FromArgs)]
/// TinyWasm CLI
@@ -68,20 +69,30 @@ fn main() -> Result<()> {
.filter_level(level)
.init();
+ let cwd = std::env::current_dir()?;
+
match args.nested {
TinyWasmSubcommand::Run(Run { wasm_file, engine }) => {
- let wasm = std::fs::read(wasm_file)?;
+ let path = cwd.join(wasm_file.clone());
+ let module = match wasm_file.ends_with(".wat") {
+ true => {
+ let wat = std::fs::read_to_string(path)?;
+ let wasm = wat::wat2wasm(&wat);
+ tinywasm::Module::parse_bytes(&wasm)?
+ }
+ false => tinywasm::Module::parse_file(path)?,
+ };
+
match engine {
- Engine::Main => run(&wasm),
+ Engine::Main => run(module),
}
}
}
}
-fn run(wasm: &[u8]) -> Result<()> {
+fn run(module: Module) -> Result<()> {
let mut store = tinywasm::Store::default();
- let module = tinywasm::Module::parse_bytes(wasm)?;
let instance = module.instantiate(&mut store)?;
let func = instance.get_func(&store, "add")?;
let params = vec![WasmValue::I32(2), WasmValue::I32(2)];
diff --git a/crates/cli/wat.rs b/crates/cli/wat.rs
new file mode 100644
index 0000000..22d931d
--- /dev/null
+++ b/crates/cli/wat.rs
@@ -0,0 +1,10 @@
+use wast::{
+ parser::{self, ParseBuffer},
+ Wat,
+};
+
+pub fn wat2wasm<'a>(wat: &str) -> Vec<u8> {
+ let buf = ParseBuffer::new(wat).expect("failed to create parse buffer");
+ let mut module = parser::parse::<Wat>(&buf).expect("failed to parse wat");
+ module.encode().expect("failed to encode wat")
+}