use wasm_bindgen::prelude::*;
use crate::logic::crud::{DeletePolicy, EntityKind};
fn parse_kind(s: &str) -> Result<EntityKind, JsValue> {
match s {
"persons" | "person" => Ok(EntityKind::Person),
"families" | "family" => Ok(EntityKind::Family),
"events" | "event" => Ok(EntityKind::Event),
"links" | "link" => Ok(EntityKind::Link),
"occupations" | "occupation" => Ok(EntityKind::Occupation),
"sources" | "source" => Ok(EntityKind::Source),
"places" | "place" => Ok(EntityKind::Place),
"documents" | "document" => Ok(EntityKind::Document),
other => Err(JsValue::from_str(&format!("unknown entity kind {other:?}"))),
}
}
fn parse_policy(s: &str) -> Result<DeletePolicy, JsValue> {
match s {
"reject" => Ok(DeletePolicy::Reject),
"cascade" => Ok(DeletePolicy::Cascade),
"orphan" => Ok(DeletePolicy::Orphan),
other => Err(JsValue::from_str(&format!(
"unknown delete policy {other:?}"
))),
}
}
#[wasm_bindgen(js_name = createBundle)]
pub fn create_bundle_wasm(family_name: Option<String>) -> String {
crate::create_bundle(family_name.as_deref()).to_json()
}
#[wasm_bindgen(js_name = importBundle)]
pub fn import_bundle_wasm(zip_bytes: &[u8]) -> String {
crate::import_bundle(zip_bytes).to_json()
}
#[wasm_bindgen(js_name = exportBundle)]
pub fn export_bundle_wasm(flat_json: &str) -> String {
crate::export_bundle(flat_json).to_json()
}
#[wasm_bindgen(js_name = inspect)]
pub fn inspect_wasm(flat_json: &str) -> String {
crate::inspect(flat_json).to_json()
}
#[wasm_bindgen(js_name = validate)]
pub fn validate_wasm(flat_json: &str) -> String {
crate::validate(flat_json).to_json()
}
#[wasm_bindgen(js_name = addEntity)]
pub fn add_entity_wasm(flat_json: &str, kind: &str, entity_json: &str) -> String {
match parse_kind(kind) {
Ok(k) => crate::add_entity(flat_json, k, entity_json).to_json(),
Err(e) => e.as_string().unwrap_or_default(),
}
}
#[wasm_bindgen(js_name = updateEntity)]
pub fn update_entity_wasm(flat_json: &str, kind: &str, entity_json: &str) -> String {
match parse_kind(kind) {
Ok(k) => crate::update_entity(flat_json, k, entity_json).to_json(),
Err(e) => e.as_string().unwrap_or_default(),
}
}
#[wasm_bindgen(js_name = deleteEntity)]
pub fn delete_entity_wasm(flat_json: &str, kind: &str, id: &str, policy: &str) -> String {
let k = match parse_kind(kind) {
Ok(k) => k,
Err(e) => return e.as_string().unwrap_or_default(),
};
let p = match parse_policy(policy) {
Ok(p) => p,
Err(e) => return e.as_string().unwrap_or_default(),
};
crate::delete_entity(flat_json, k, id, p).to_json()
}
#[wasm_bindgen(js_name = deduplicate)]
pub fn deduplicate_wasm(flat_json: &str) -> String {
crate::deduplicate(flat_json).to_json()
}
#[cfg(feature = "gedcom")]
#[wasm_bindgen(js_name = convertGedcom)]
pub fn convert_gedcom_wasm(
gedcom_bytes: &[u8],
default_confidence: f64,
place_lang: &str,
) -> String {
crate::convert_gedcom(gedcom_bytes, default_confidence, place_lang).to_json()
}