use wasm_bindgen::prelude::*;
use inputx_nihongo::{
JapaneseEngine as CoreEngine, KanaKind as CoreKanaKind,
};
#[wasm_bindgen]
#[derive(Copy, Clone)]
pub enum KanaKind {
Hiragana = 0,
Katakana = 1,
Kanji = 2,
}
impl From<CoreKanaKind> for KanaKind {
fn from(k: CoreKanaKind) -> Self {
match k {
CoreKanaKind::Hiragana => KanaKind::Hiragana,
CoreKanaKind::Katakana => KanaKind::Katakana,
CoreKanaKind::Kanji => KanaKind::Kanji,
}
}
}
#[wasm_bindgen]
pub struct JapaneseEngine {
engine: CoreEngine,
}
#[wasm_bindgen]
impl JapaneseEngine {
#[wasm_bindgen(constructor)]
pub fn new() -> JapaneseEngine {
Self { engine: CoreEngine::new() }
}
#[wasm_bindgen(js_name = handleLetter)]
pub fn handle_letter(&mut self, byte: u8) -> bool {
self.engine.handle_letter(byte)
}
pub fn backspace(&mut self) -> bool {
self.engine.backspace()
}
pub fn escape(&mut self) -> bool {
self.engine.escape()
}
pub fn preedit(&self) -> String {
self.engine.preedit().to_string()
}
#[wasm_bindgen(js_name = isComposing, getter)]
pub fn is_composing(&self) -> bool {
self.engine.is_composing()
}
pub fn candidates(&self) -> js_sys::Array {
let arr = js_sys::Array::new();
for c in self.engine.candidates() {
let obj = js_sys::Object::new();
let _ = js_sys::Reflect::set(
&obj,
&"word".into(),
&JsValue::from_str(&c.word),
);
let kind: KanaKind = c.kind.into();
let _ = js_sys::Reflect::set(
&obj,
&"kind".into(),
&JsValue::from_f64(kind as u32 as f64),
);
let _ = js_sys::Reflect::set(
&obj,
&"freq".into(),
&JsValue::from_f64(c.freq as f64),
);
let _ = js_sys::Reflect::set(
&obj,
&"composed".into(),
&JsValue::from_bool(c.composed),
);
let _ = js_sys::Reflect::set(
&obj,
&"proximityMilli".into(),
&JsValue::from_f64(c.proximity_milli as f64),
);
arr.push(&obj);
}
arr
}
#[wasm_bindgen(js_name = commitIndex)]
pub fn commit_index(&mut self, index: usize) -> Option<String> {
self.engine.commit_index(index)
}
}
impl Default for JapaneseEngine {
fn default() -> Self {
Self::new()
}
}