use confium_attributes::{
Predicate as RustPredicate, SignerAttributes, evaluate, parse as dsl_parse,
};
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub struct Predicate {
inner: RustPredicate,
}
#[wasm_bindgen]
impl Predicate {
#[wasm_bindgen(constructor)]
pub fn parse(expr: &str) -> Result<Predicate, JsValue> {
let inner = dsl_parse(expr).map_err(|e| JsValue::from_str(&e.to_string()))?;
Ok(Self { inner })
}
pub fn satisfied_by(&self, signers_json: &str) -> Result<bool, JsValue> {
let parsed: Vec<SignerEntry> = serde_json::from_str(signers_json)
.map_err(|e| JsValue::from_str(&format!("invalid signers JSON: {e}")))?;
let owned: Vec<SignerAttributes> = parsed
.into_iter()
.map(|entry| {
let mut s = SignerAttributes::new();
for (k, values) in entry.0 {
for v in values {
s.add(k.clone(), v);
}
}
s
})
.collect();
let refs: Vec<&SignerAttributes> = owned.iter().collect();
Ok(evaluate(&self.inner, &refs))
}
}
#[derive(serde::Deserialize)]
struct SignerEntry(std::collections::HashMap<String, Vec<String>>);