use super::prelude::*;
use crate::Utf16IndexMap as RustUtf16IndexMap;
use self_cell::self_cell;
use std::sync::Arc;
self_cell!(
struct Utf16IndexMapInner {
owner: String,
#[covariant]
dependent: RustUtf16IndexMap,
}
impl {Debug}
);
#[wasm_bindgen]
#[derive(Debug)]
pub struct Utf16IndexMap {
inner: Arc<Utf16IndexMapInner>,
}
#[wasm_bindgen]
impl Utf16IndexMap {
#[inline]
pub(crate) fn get(&self) -> &RustUtf16IndexMap<'_> {
self.inner.borrow_dependent()
}
#[wasm_bindgen(constructor)]
pub fn new(text: String) -> Utf16IndexMap {
let inner =
Utf16IndexMapInner::new(text, |text: &String| RustUtf16IndexMap::new(text));
Utf16IndexMap {
inner: Arc::new(inner),
}
}
#[wasm_bindgen]
pub fn copy(&self) -> Utf16IndexMap {
Utf16IndexMap {
inner: Arc::clone(&self.inner),
}
}
fn check_index(&self, index: usize) -> Result<(), JsValue> {
let text = self.inner.borrow_owner();
if index > text.len() {
let message = format!(
"UTF-8 byte index out of range: {} (byte length {}",
index,
text.len(),
);
Err(JsValue::from_str(&message))
} else {
Ok(())
}
}
#[wasm_bindgen]
pub fn get_index(&self, index: usize) -> Result<usize, JsValue> {
self.check_index(index)?;
let new_index = self.get().get_index(index);
Ok(new_index)
}
}