1mod decrypt;
2pub mod searcher;
3
4use wasm_bindgen::prelude::*;
5use crate::searcher::{DbSearcher, SearchMode};
6
7#[wasm_bindgen]
8pub struct CzdbSearcher {
9 inner: DbSearcher,
10}
11
12#[wasm_bindgen]
13impl CzdbSearcher {
14 #[wasm_bindgen(constructor)]
15 pub fn new(data: &[u8], key: &str) -> Result<CzdbSearcher, JsError> {
16 let searcher = DbSearcher::new(data.to_vec(), key)
17 .map_err(|e| JsError::new(&e.to_string()))?;
18 Ok(CzdbSearcher { inner: searcher })
19 }
20
21 #[wasm_bindgen]
23 pub fn new_with_mode(data: &[u8], key: &str, mode: u8) -> Result<CzdbSearcher, JsError> {
24 let search_mode = match mode {
25 0 => SearchMode::Memory,
26 1 => SearchMode::BTree,
27 _ => SearchMode::Memory,
28 };
29 let searcher = DbSearcher::with_mode(data.to_vec(), key, search_mode)
30 .map_err(|e| JsError::new(&e.to_string()))?;
31 Ok(CzdbSearcher { inner: searcher })
32 }
33
34 pub fn search(&self, ip: &str) -> Result<String, JsError> {
35 self.inner.search(ip).map_err(|e| JsError::new(&e.to_string()))
36 }
37
38 pub fn search_batch(&self, ips: Vec<String>) -> Result<Vec<String>, JsError> {
40 let mut results = Vec::with_capacity(ips.len());
41 for ip in ips {
42 results.push(self.inner.search(&ip).unwrap_or_else(|_| "Error".to_string()));
43 }
44 Ok(results)
45 }
46
47 pub fn search_mode(&self) -> u8 {
49 match self.inner.search_mode() {
50 SearchMode::Memory => 0,
51 SearchMode::BTree => 1,
52 }
53 }
54}