use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub struct ParseResult {
pattern_count: usize,
identifiers: Vec<String>,
}
#[wasm_bindgen]
impl ParseResult {
#[wasm_bindgen(getter)]
pub fn pattern_count(&self) -> usize {
self.pattern_count
}
#[wasm_bindgen(getter)]
pub fn identifiers(&self) -> Vec<String> {
self.identifiers.clone()
}
}
#[wasm_bindgen]
pub fn parse_gram(input: &str) -> Result<ParseResult, JsValue> {
let patterns =
crate::parse_gram(input).map_err(|e| JsValue::from_str(&format!("Parse error: {}", e)))?;
let identifiers: Vec<String> = patterns
.iter()
.map(|p| p.value().identity.0.clone())
.collect();
Ok(ParseResult {
pattern_count: patterns.len(),
identifiers,
})
}
#[wasm_bindgen]
pub fn validate_gram(input: &str) -> bool {
crate::validate_gram(input).is_ok()
}
#[wasm_bindgen]
pub fn round_trip(input: &str) -> Result<String, JsValue> {
let patterns =
crate::parse_gram(input).map_err(|e| JsValue::from_str(&format!("Parse error: {}", e)))?;
crate::to_gram(&patterns).map_err(|e| JsValue::from_str(&format!("Serialize error: {}", e)))
}
#[wasm_bindgen]
pub fn parse_to_ast(input: &str) -> Result<JsValue, JsValue> {
let ast = crate::parse_to_ast(input)
.map_err(|e| JsValue::from_str(&format!("Parse error: {}", e)))?;
let json_str = serde_json::to_string(&ast)
.map_err(|e| JsValue::from_str(&format!("Serialization error: {}", e)))?;
let js_json = js_sys::JSON::parse(&json_str)
.map_err(|e| JsValue::from_str(&format!("JSON parse error: {:?}", e)))?;
Ok(js_json)
}
#[wasm_bindgen]
pub fn version() -> String {
env!("CARGO_PKG_VERSION").to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_validate_gram() {
assert!(validate_gram("(hello)"));
assert!(validate_gram("(a)-->(b)"));
assert!(!validate_gram("(unclosed"));
}
#[test]
fn test_parse_gram() {
let result = parse_gram("(alice) (bob)").unwrap();
assert_eq!(result.pattern_count, 2);
assert_eq!(result.identifiers.len(), 2);
}
#[test]
fn test_round_trip() {
let input = "(hello)";
let output = round_trip(input).unwrap();
assert_eq!(output, "(hello)");
}
}