use serde::Serialize;
use std::path::PathBuf;
use wasm_bindgen::prelude::*;
use crate::language::syntax::parser::driver::SimpleParser;
#[derive(Serialize)]
pub struct ParseResult {
pub success: bool,
pub statements: Vec<StatementInfo>,
pub errors: Vec<String>,
}
#[derive(Serialize)]
pub struct StatementInfo {
pub kind: String,
pub line: usize,
}
#[wasm_bindgen]
pub fn parse(entry_path: &str, source: &str) -> Result<JsValue, JsValue> {
match SimpleParser::parse(source, PathBuf::from(entry_path)) {
Ok(statements) => {
let statement_infos: Vec<StatementInfo> = statements
.iter()
.map(|stmt| StatementInfo {
kind: format!("{:?}", stmt.kind),
line: stmt.line,
})
.collect();
let result = ParseResult {
success: true,
statements: statement_infos,
errors: vec![],
};
serde_wasm_bindgen::to_value(&result)
.map_err(|e| JsValue::from_str(&format!("Serialization error: {}", e)))
}
Err(e) => {
let result = ParseResult {
success: false,
statements: vec![],
errors: vec![format!("{}", e)],
};
serde_wasm_bindgen::to_value(&result)
.map_err(|e| JsValue::from_str(&format!("Serialization error: {}", e)))
}
}
}
#[wasm_bindgen]
pub fn check_syntax(source: &str) -> bool {
SimpleParser::parse(source, PathBuf::from("check.deva")).is_ok()
}