use crate::types::ValidationConfig;
use crate::validator::validate_manifest_with_config;
use serde::{Deserialize, Serialize};
use wasm_bindgen::prelude::*;
#[derive(Debug, Serialize, Deserialize)]
#[wasm_bindgen(getter_with_clone)]
pub struct WasmValidationResult {
pub success: bool,
pub report: String,
}
#[wasm_bindgen]
pub fn validate_manifest(
manifest_json: &str,
config_json: &str,
) -> Result<WasmValidationResult, JsError> {
let manifest: serde_json::Value = serde_json::from_str(manifest_json)
.map_err(|e| JsError::new(&format!("Invalid manifest JSON: {}", e)))?;
let config: ValidationConfig = serde_json::from_str(config_json)
.map_err(|e| JsError::new(&format!("Invalid config JSON: {}", e)))?;
let report = validate_manifest_with_config(&manifest, &config);
let report_str = serde_json::to_string_pretty(&report)
.map_err(|e| JsError::new(&format!("Failed to serialize report: {}", e)))?;
Ok(WasmValidationResult {
success: report.schema_valid
&& report.ttl_valid
&& report.inspector_valid
&& report.crypto_valid
&& report.policy_valid,
report: report_str,
})
}
#[wasm_bindgen]
pub fn validate_manifest_default(manifest_json: &str) -> Result<WasmValidationResult, JsError> {
let config = ValidationConfig::default();
let config_json = serde_json::to_string(&config)
.map_err(|e| JsError::new(&format!("Failed to serialize config: {}", e)))?;
validate_manifest(manifest_json, &config_json)
}
#[wasm_bindgen]
pub fn get_default_config() -> Result<String, JsError> {
let config = ValidationConfig::default();
serde_json::to_string_pretty(&config)
.map_err(|e| JsError::new(&format!("Failed to serialize config: {}", e)))
}
#[wasm_bindgen]
pub fn is_valid_json(input: &str) -> bool {
serde_json::from_str::<serde_json::Value>(input).is_ok()
}
#[wasm_bindgen]
pub fn format_json(input: &str) -> Result<String, JsError> {
let value: serde_json::Value =
serde_json::from_str(input).map_err(|e| JsError::new(&format!("Invalid JSON: {}", e)))?;
serde_json::to_string_pretty(&value)
.map_err(|e| JsError::new(&format!("Failed to format JSON: {}", e)))
}
#[wasm_bindgen]
pub fn get_version() -> String {
env!("CARGO_PKG_VERSION").to_string()
}
#[wasm_bindgen]
pub fn get_name() -> String {
env!("CARGO_PKG_NAME").to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_wasm_validate() {
let manifest = r#"{
"kyaVersion": "1.0",
"agentId": "did:key:z6Mk..."
}"#;
let result = validate_manifest_default(manifest);
assert!(result.is_ok());
}
#[test]
fn test_is_valid_json() {
assert!(is_valid_json(r#"{"test": true}"#));
assert!(!is_valid_json(r#"{"test": "#));
}
#[test]
fn test_format_json() {
let input = r#"{"test":true}"#;
let result = format_json(input);
assert!(result.is_ok());
}
}