use crate::Filter;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub struct WasmFilter {
inner: Filter,
}
#[wasm_bindgen]
impl WasmFilter {
#[wasm_bindgen(constructor)]
pub fn new() -> Self {
Self { inner: Filter::new() }
}
#[wasm_bindgen(js_name = addWord)]
pub fn add_word(&mut self, word: &str) {
self.inner.add_word(word);
}
#[wasm_bindgen(js_name = addWords)]
pub fn add_words(&mut self, words: &js_sys::Array) {
let words: Vec<String> = words.iter().filter_map(|v| v.as_string()).collect();
let refs: Vec<&str> = words.iter().map(|s| s.as_str()).collect();
self.inner.add_words(&refs);
}
#[wasm_bindgen(js_name = findIn)]
pub fn find_in(&self, text: &str) -> JsValue {
let (found, word) = self.inner.find_in(text);
let obj = js_sys::Object::new();
js_sys::Reflect::set(&obj, &"found".into(), &JsValue::from_bool(found)).ok();
js_sys::Reflect::set(&obj, &"word".into(), &JsValue::from_str(&word)).ok();
obj.into()
}
#[wasm_bindgen(js_name = findAll)]
pub fn find_all(&self, text: &str) -> js_sys::Array {
let words = self.inner.find_all(text);
let arr = js_sys::Array::new();
for word in words {
arr.push(&JsValue::from_str(&word));
}
arr
}
pub fn replace(&self, text: &str, replacement: char) -> String {
self.inner.replace(text, replacement)
}
pub fn filter(&self, text: &str) -> String {
self.inner.filter(text)
}
#[wasm_bindgen(js_name = loadWords)]
pub fn load_words(&mut self, content: &str) {
for line in content.lines() {
let trimmed = line.trim();
if !trimmed.is_empty() {
self.inner.add_word(trimmed);
}
}
}
}
impl Default for WasmFilter {
fn default() -> Self {
Self::new()
}
}