use serde_json::Value;
use wasm_bindgen::prelude::*;
use crate::passport::{verify_capsule, verify_capsule_strict, StrictVerifyOpts};
use crate::wasm_types::{WasmStrictCheck, WasmStrictReport};
#[wasm_bindgen(js_name = verify_capsule_json)]
pub fn verify_capsule_json_js(capsule_json: &str) -> Result<JsValue, JsValue> {
let value: Value = serde_json::from_str(capsule_json)
.map_err(|e| JsValue::from_str(&format!("capsule.parse_error: {e}")))?;
match verify_capsule(&value) {
Ok(()) => Ok(JsValue::NULL),
Err(e) => Err(JsValue::from_str(&format!("{} ({})", e, e.code()))),
}
}
#[wasm_bindgen(js_name = verify_capsule_strict_json)]
pub fn verify_capsule_strict_json_js(capsule_json: &str) -> Result<JsValue, JsValue> {
let value: Value = serde_json::from_str(capsule_json)
.map_err(|e| JsValue::from_str(&format!("capsule.parse_error: {e}")))?;
let report = verify_capsule_strict(&value, &StrictVerifyOpts::default());
use crate::passport::{CheckOutcome, StrictVerifyReport};
let labels = StrictVerifyReport::labels();
let outcomes: Vec<&CheckOutcome> = report.iter().collect();
let checks: Vec<WasmStrictCheck> = labels
.iter()
.zip(outcomes.iter())
.map(|(label, outcome)| {
let (status, detail) = match outcome {
CheckOutcome::Passed => ("PASSED", None),
CheckOutcome::Skipped(d) => ("SKIPPED", Some(d.clone())),
CheckOutcome::Failed(d) => ("FAILED", Some(d.clone())),
};
WasmStrictCheck {
label: *label,
outcome: status,
detail,
}
})
.collect();
let any_failed = outcomes.iter().any(|o| o.is_failed());
let any_skipped = outcomes.iter().any(|o| o.is_skipped());
let payload = WasmStrictReport {
ok: report.is_fully_ok(),
any_failed,
any_skipped,
checks,
};
serde_wasm_bindgen::to_value(&payload)
.map_err(|e| JsValue::from_str(&format!("serialize_report: {e}")))
}
#[wasm_bindgen(js_name = sbo3l_core_version)]
pub fn sbo3l_core_version_js() -> String {
crate::version().to_string()
}