use super::page_info::PageInfo;
use super::prelude::*;
use super::settings::WikitextSettings;
use super::tokenizer::Tokenization;
use crate::Tokenization as RustTokenization;
use crate::parsing::{ParseError as RustParseError, ParseOutcome as RustParseOutcome};
use crate::tree::SyntaxTree as RustSyntaxTree;
use crate::utf16::Utf16IndexMap;
use std::sync::Arc;
#[wasm_bindgen]
#[derive(Debug, Clone)]
pub struct ParseOutcome {
inner: Arc<RustParseOutcome<RustSyntaxTree<'static>>>,
}
#[wasm_bindgen]
impl ParseOutcome {
#[wasm_bindgen]
pub fn copy(&self) -> ParseOutcome {
ParseOutcome {
inner: Arc::clone(&self.inner),
}
}
#[wasm_bindgen]
pub fn syntax_tree(&self) -> SyntaxTree {
let tree = self.inner.value().clone();
SyntaxTree {
inner: Arc::new(tree),
}
}
#[wasm_bindgen]
pub fn errors(&self) -> Result<JsValue, JsValue> {
rust_to_js!(self.inner.errors())
}
}
#[wasm_bindgen]
#[derive(Debug, Clone)]
pub struct SyntaxTree {
inner: Arc<RustSyntaxTree<'static>>,
}
#[wasm_bindgen]
impl SyntaxTree {
#[inline]
pub(crate) fn get(&self) -> &RustSyntaxTree<'static> {
&self.inner
}
#[wasm_bindgen]
pub fn copy(&self) -> SyntaxTree {
SyntaxTree {
inner: Arc::clone(&self.inner),
}
}
#[wasm_bindgen]
pub fn data(&self) -> Result<JsValue, JsValue> {
rust_to_js!(*self.inner)
}
}
#[wasm_bindgen]
pub fn parse(
tokens: Tokenization,
page_info: PageInfo,
settings: WikitextSettings,
) -> Result<ParseOutcome, JsValue> {
let tokenization = tokens.get();
let page_info = page_info.get();
let settings = settings.get();
let (syntax_tree, errors) = crate::parse(tokenization, page_info, settings).into();
let syntax_tree = syntax_tree.to_owned();
let errors = convert_errors_utf16(tokenization, errors);
let inner = Arc::new(RustParseOutcome::new(syntax_tree, errors));
Ok(ParseOutcome { inner })
}
fn convert_errors_utf16(
tokenization: &RustTokenization,
errors: Vec<RustParseError>,
) -> Vec<RustParseError> {
if errors.is_empty() {
return errors;
}
let full_text = tokenization.full_text().inner();
let utf16_map = Utf16IndexMap::new(full_text);
errors
.into_iter()
.map(|err| err.to_utf16_indices(&utf16_map))
.collect()
}