confium_wasm/
attributes.rs1use confium_attributes::{
4 Predicate as RustPredicate, SignerAttributes, evaluate, parse as dsl_parse,
5};
6use wasm_bindgen::prelude::*;
7
8#[wasm_bindgen]
11pub struct Predicate {
12 inner: RustPredicate,
13}
14
15#[wasm_bindgen]
16impl Predicate {
17 #[wasm_bindgen(constructor)]
25 pub fn parse(expr: &str) -> Result<Predicate, JsValue> {
26 let inner = dsl_parse(expr).map_err(|e| JsValue::from_str(&e.to_string()))?;
27 Ok(Self { inner })
28 }
29
30 pub fn satisfied_by(&self, signers_json: &str) -> Result<bool, JsValue> {
40 let parsed: Vec<SignerEntry> = serde_json::from_str(signers_json)
41 .map_err(|e| JsValue::from_str(&format!("invalid signers JSON: {e}")))?;
42 let owned: Vec<SignerAttributes> = parsed
43 .into_iter()
44 .map(|entry| {
45 let mut s = SignerAttributes::new();
46 for (k, values) in entry.0 {
47 for v in values {
48 s.add(k.clone(), v);
49 }
50 }
51 s
52 })
53 .collect();
54 let refs: Vec<&SignerAttributes> = owned.iter().collect();
55 Ok(evaluate(&self.inner, &refs))
56 }
57}
58
59#[derive(serde::Deserialize)]
60struct SignerEntry(std::collections::HashMap<String, Vec<String>>);