diff options
| author | Henry Gressmann <mail@henrygressmann.de> | 2023-12-04 01:53:09 +0100 |
|---|---|---|
| committer | Henry Gressmann <mail@henrygressmann.de> | 2023-12-04 01:53:09 +0100 |
| commit | 829db60c869ea5ec9be37e6fc2ad94c2965d63d4 (patch) | |
| tree | e007a6885b4d8425d05d09f9d1297c3a599f6c30 /crates/cli | |
| parent | 1fb52089715631f4edb2abdc592547d0f5121161 (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.toml | 5 | ||||
| -rw-r--r-- | crates/cli/bin.rs | 21 | ||||
| -rw-r--r-- | crates/cli/wat.rs | 10 |
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") +} |
