use wasm_bindgen::prelude::*;
use crate::{
data_hash_exclusions, embed_manifest, fill_manifest, read_manifest, read_manifest_uri,
remove_manifest, reserve_manifest, verify, ManifestSource,
};
fn js_err(e: crate::Error) -> JsError {
JsError::new(&e.to_string())
}
#[wasm_bindgen(js_name = embedManifest)]
pub fn embed_manifest_wasm(font: &[u8], manifest_store: Vec<u8>) -> Result<Vec<u8>, JsError> {
embed_manifest(font, ManifestSource::embedded(manifest_store)).map_err(js_err)
}
#[wasm_bindgen(js_name = embedRemote)]
pub fn embed_remote_wasm(font: &[u8], uri: &str) -> Result<Vec<u8>, JsError> {
embed_manifest(font, ManifestSource::remote(uri)).map_err(js_err)
}
#[wasm_bindgen(js_name = readManifest)]
pub fn read_manifest_wasm(font: &[u8]) -> Result<Vec<u8>, JsError> {
read_manifest(font).map_err(js_err)
}
#[wasm_bindgen(js_name = readManifestUri)]
pub fn read_manifest_uri_wasm(font: &[u8]) -> Result<Option<String>, JsError> {
read_manifest_uri(font).map_err(js_err)
}
#[wasm_bindgen(js_name = removeManifest)]
pub fn remove_manifest_wasm(font: &[u8]) -> Result<Vec<u8>, JsError> {
remove_manifest(font).map_err(js_err)
}
#[wasm_bindgen(js_name = isCompliant)]
pub fn is_compliant_wasm(font: &[u8]) -> Result<bool, JsError> {
Ok(verify(font).map_err(js_err)?.is_compliant())
}
#[wasm_bindgen(js_name = reserveManifest)]
pub fn reserve_manifest_wasm(
font: &[u8],
reserve_size: usize,
uri: Option<String>,
) -> Result<Vec<u8>, JsError> {
Ok(reserve_manifest(font, reserve_size, uri)
.map_err(js_err)?
.font)
}
#[wasm_bindgen(js_name = dataHashExclusions)]
pub fn data_hash_exclusions_wasm(font: &[u8]) -> Result<String, JsError> {
let ex = data_hash_exclusions(font).map_err(js_err)?;
let items: Vec<String> = ex
.iter()
.map(|e| format!("{{\"start\":{},\"length\":{}}}", e.start, e.length))
.collect();
Ok(format!("[{}]", items.join(",")))
}
#[wasm_bindgen(js_name = fillManifest)]
pub fn fill_manifest_wasm(
reserved_font: &[u8],
signed_manifest: &[u8],
) -> Result<Vec<u8>, JsError> {
fill_manifest(reserved_font, signed_manifest).map_err(js_err)
}