summaryrefslogtreecommitdiff
path: root/crates/cli/src/cmd/run.rs
diff options
context:
space:
mode:
authorHenry <mail@henrygressmann.de>2026-04-26 19:44:34 +0200
committerHenry <mail@henrygressmann.de>2026-04-26 19:44:34 +0200
commit463a3a6f56a5ca06cda890fd6fe7f16485ef70a0 (patch)
treebfa657a2de16c04cd36f4b6c61e77b370fcd46fc /crates/cli/src/cmd/run.rs
parent27004a8738c7a3c32ac4fb6966f32647b4c96db7 (diff)
feat: new tinywasm cli
Signed-off-by: Henry <mail@henrygressmann.de>
Diffstat (limited to 'crates/cli/src/cmd/run.rs')
-rw-r--r--crates/cli/src/cmd/run.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/crates/cli/src/cmd/run.rs b/crates/cli/src/cmd/run.rs
new file mode 100644
index 0000000..b2f5e03
--- /dev/null
+++ b/crates/cli/src/cmd/run.rs
@@ -0,0 +1,47 @@
+use eyre::{Result, bail};
+use tinywasm::types::ExportType;
+use tinywasm::{ModuleInstance, Store};
+
+use crate::cli::RunArgs;
+use crate::load::load_module;
+use crate::output::print_results;
+use crate::value_parse::parse_invocation_args;
+
+pub fn run(args: RunArgs) -> Result<()> {
+ let module_path = args.module.as_deref().ok_or_else(|| eyre::eyre!("missing module path"))?;
+ let loaded = load_module(module_path)?;
+ let mut store = Store::new(args.engine.build_engine()?);
+ let instance = ModuleInstance::instantiate_no_start(&mut store, &loaded.module, None)?;
+
+ match args.invoke.as_deref() {
+ Some(export) => {
+ if loaded.module.start_func.is_some() {
+ let _ = instance.start(&mut store)?;
+ }
+
+ let func_ty = loaded
+ .module
+ .exports()
+ .find_map(|item| match (item.name == export, item.ty) {
+ (true, ExportType::Func(ty)) => Some(ty),
+ _ => None,
+ })
+ .ok_or_else(|| eyre::eyre!("export is not a function: {export}"))?;
+ let func = instance.func_untyped(&store, export)?;
+ let params = parse_invocation_args(func_ty, &args.args)?;
+ let results = func.call(&mut store, &params)?;
+ print_results(&results);
+ Ok(())
+ }
+ None => {
+ if instance.start_func(&store)?.is_none() {
+ bail!(
+ "module has no start function or `_start` export; use `tinywasm inspect {module_path}` or `tinywasm run --invoke <export> {module_path}`"
+ )
+ }
+
+ let _ = instance.start(&mut store)?;
+ Ok(())
+ }
+ }
+}