diff --git a/Cargo.lock b/Cargo.lock index 960095a..378c4bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -41,7 +41,7 @@ dependencies = [ [[package]] name = "argus" version = "0.1.4" -source = "git+https://deemz.org/git/research/argus.git?branch=dev#654a0521f7020b059e134a477f280a8a5a98a490" +source = "git+https://deemz.org/git/research/argus.git?rev=654a0521f7020b059e134a477f280a8a5a98a490#654a0521f7020b059e134a477f280a8a5a98a490" dependencies = [ "argus-derive", "chumsky", @@ -58,7 +58,7 @@ dependencies = [ [[package]] name = "argus-derive" version = "0.1.2" -source = "git+https://deemz.org/git/research/argus.git?branch=dev#654a0521f7020b059e134a477f280a8a5a98a490" +source = "git+https://deemz.org/git/research/argus.git?rev=654a0521f7020b059e134a477f280a8a5a98a490#654a0521f7020b059e134a477f280a8a5a98a490" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 715d852..71e8d27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ version = "0.1.4" # follows argus version crate-type = ["cdylib"] [dependencies] -argus = { git = "https://deemz.org/git/research/argus.git", branch = "dev" } +argus = { git = "https://deemz.org/git/research/argus.git", rev="654a0521f7020b059e134a477f280a8a5a98a490" } js-sys = "0.3.82" serde = { version = "1.0.228", features = ["derive"] } serde-wasm-bindgen = "0.6.5" diff --git a/pkg/argus_wasm.js b/pkg/argus_wasm.js index 8cc58dd..1356d94 100644 --- a/pkg/argus_wasm.js +++ b/pkg/argus_wasm.js @@ -293,6 +293,10 @@ function __wbg_get_imports() { const ret = arg0.done; return ret; }; + imports.wbg.__wbg_entries_e171b586f8f6bdbf = function(arg0) { + const ret = Object.entries(arg0); + return ret; + }; imports.wbg.__wbg_get_7bed016f185add81 = function(arg0, arg1) { const ret = arg0[arg1 >>> 0]; return ret; diff --git a/pkg/argus_wasm_bg.wasm b/pkg/argus_wasm_bg.wasm index 0ace620..105a6ad 100644 Binary files a/pkg/argus_wasm_bg.wasm and b/pkg/argus_wasm_bg.wasm differ diff --git a/src/lib.rs b/src/lib.rs index d47f356..dd50dd6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,30 +16,17 @@ use serde::{Serialize, Deserialize}; use serde_wasm_bindgen::{from_value, to_value}; use std::time::Duration; -// #[wasm_bindgen] -// pub struct WrappedExpr { -// expr: Expr, -// } - -// #[wasm_bindgen] -// pub fn parse_str(s: &str) -> WrappedExpr { -// let expr = argus::parse_str(s); -// return WrappedExpr{ -// expr: expr.expect("fuck!!!!"), -// }; -// } - struct TraceMap<'a> { - events: HashMap<&'a str, Signal>, + traces: HashMap<&'a str, Signal>, } impl<'a> Trace for TraceMap<'a> { fn signal_names(&self) -> Vec<&str> { - self.events.keys().cloned().collect() + self.traces.keys().cloned().collect() } fn get(&self, name: &str) -> Option<&Signal> { - let sig: &dyn AnySignal = match self.events.get(name) { + let sig: &dyn AnySignal = match self.traces.get(name) { Some(signal) => signal, None => return None, }; @@ -47,42 +34,12 @@ impl<'a> Trace for TraceMap<'a> { } } - - -// type MyTrace = Vec -// struct MyResult { -// ok: , -// } - -// pub struct DefaultFalse; - -// use argus::signals::{InterpolationMethod, Sample}; - -// use argus::core::utils::Neighborhood; - -// impl InterpolationMethod for DefaultFalse { -// fn at(a: &super::Sample, b: &super::Sample, time: std::time::Duration) -> Option { -// if time == a.time { -// Some(a.value) -// } -// else if time == b.time { -// Some(b.value) -// } -// else { -// Some(false) -// } -// } - -// fn find_intersection(_a: &Neighborhood, _b: &Neighborhood) -> Option> { -// None -// } -// } - #[derive(Serialize, Deserialize)] pub struct StateBuddyTraceEntry { simtime: f64, - inputEvent: String, - outputEvents: Vec, + state: HashMap, + // inputEvent: String, + // outputEvents: Vec, } #[derive(Serialize, Deserialize)] @@ -90,43 +47,38 @@ pub struct StateBuddyTrace { entries: Vec, } -// #[wasm_bindgen] -// impl StateBuddyTrace { -// #[wasm_bindgen(constructor)] -// pub fn new(entries: &Vec) { -// StateBuddyTrace{entries} -// } -// } - - #[wasm_bindgen] pub fn eval_boolean(s: &str, js_trace: JsValue) -> JsValue { + // convert input (a sequence of state-objects) to a Trace that argus accepts: let trace: StateBuddyTrace = match from_value(js_trace) { Ok(trace) => trace, Err(e) => return JsValue::from_str("failed to parse JSON"), }; - let mut traceMap = HashMap::<&str, Signal>::new(); + let mut traceMap = HashMap::<&str, Signal>::new(); for entry in &trace.entries { - let value = traceMap.entry(entry.inputEvent.as_str()).or_insert_with(|| Signal::::Sampled { - values: vec![], - time_points: vec![], - }); - if let Signal::::Sampled { values, time_points } = value { - values.push(true); - time_points.push(Duration::from_millis(entry.simtime as u64)); - } - else { - return JsValue::from_str("this should never happen"); + for (prop, val) in &entry.state { + let signal = traceMap.entry(prop.as_str()).or_insert_with(|| Signal::::Sampled { + values: vec![], + time_points: vec![], + }); + if let Signal::::Sampled { values, time_points } = signal { + values.push(*val); + time_points.push(Duration::from_millis(entry.simtime as u64)); + } + else { + return JsValue::from_str("this should never happen"); + } } } - + // parse property string let parse_result = argus::parse_str(s); let expr = match parse_result { Ok(expr) => expr, Err(e) => return JsValue::from_str("failed to parse expression"), }; + // evaluate property on trace let eval_result = match expr { - Expr::Bool(bool_expr) => BooleanSemantics::eval::(&bool_expr, &TraceMap{events: traceMap}), + Expr::Bool(bool_expr) => BooleanSemantics::eval::(&bool_expr, &TraceMap{traces: traceMap}), _ => return JsValue::from_str("expected boolean expression (this should never happen)"), }; let mut result = Vec::::new();