summaryrefslogtreecommitdiff
path: root/crates/cli/src/args.rs
diff options
context:
space:
mode:
authorHenry Gressmann <mail@henrygressmann.de>2023-12-06 14:55:53 +0100
committerHenry Gressmann <mail@henrygressmann.de>2023-12-06 14:55:53 +0100
commit7d167c2fadb370a33dd65b387dbab9d053f103a9 (patch)
treebafe2524446b5288aabc273cf6ee9494b7c42a07 /crates/cli/src/args.rs
parent5f928b74d20717342074bb29797c97d75120c21f (diff)
feat: cli now has options to specify arguments and function to run
Signed-off-by: Henry Gressmann <mail@henrygressmann.de>
Diffstat (limited to 'crates/cli/src/args.rs')
-rw-r--r--crates/cli/src/args.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/crates/cli/src/args.rs b/crates/cli/src/args.rs
new file mode 100644
index 0000000..4023be6
--- /dev/null
+++ b/crates/cli/src/args.rs
@@ -0,0 +1,48 @@
+use std::str::FromStr;
+use tinywasm::WasmValue;
+
+#[derive(Debug)]
+pub struct WasmArg(WasmValue);
+
+pub fn to_wasm_args(args: Vec<WasmArg>) -> Vec<WasmValue> {
+ args.into_iter().map(|a| a.into()).collect()
+}
+
+impl From<WasmArg> for WasmValue {
+ fn from(value: WasmArg) -> Self {
+ value.0
+ }
+}
+
+impl FromStr for WasmArg {
+ type Err = String;
+ fn from_str(s: &str) -> std::prelude::v1::Result<Self, Self::Err> {
+ let [ty, val]: [&str; 2] = s
+ .split(':')
+ .collect::<Vec<_>>()
+ .try_into()
+ .map_err(|e| format!("invalid arguments: {:?}", e))?;
+
+ let arg: WasmValue = match ty {
+ "i32" => val
+ .parse::<i32>()
+ .map_err(|e| format!("invalid argument value for i32: {e:?}"))?
+ .into(),
+ "i64" => val
+ .parse::<i64>()
+ .map_err(|e| format!("invalid argument value for i64: {e:?}"))?
+ .into(),
+ "f32" => val
+ .parse::<f32>()
+ .map_err(|e| format!("invalid argument value for f32: {e:?}"))?
+ .into(),
+ "f64" => val
+ .parse::<f64>()
+ .map_err(|e| format!("invalid argument value for f64: {e:?}"))?
+ .into(),
+ t => return Err(format!("Invalid arg type: {}", t)),
+ };
+
+ Ok(WasmArg(arg))
+ }
+}