use alpha2_model::{ImportedCaptions, Project, caption_rows, parse_srt, parse_webvtt};
use wasm_bindgen::prelude::*;
use crate::web::{internal_error, invalid_input, typed_error};
#[wasm_bindgen(js_name = parseCaptions)]
pub fn parse_captions(text: &str, format: &str) -> Result<String, JsValue> {
let imported: ImportedCaptions = match format {
"srt" => parse_srt(text).map_err(invalid_input)?,
"webvtt" => parse_webvtt(text).map_err(invalid_input)?,
other => {
return Err(invalid_input(format!(
"caption format must be srt or webvtt, not {other}"
)));
}
};
let rows = caption_rows(&imported.cues).map_err(invalid_input)?;
serde_json::to_string(&serde_json::json!({
"rows": rows,
"skipped": imported.skipped,
}))
.map_err(internal_error)
}
#[wasm_bindgen(js_name = fontFamily)]
#[must_use]
pub fn font_family(bytes: &[u8], face_index: u32) -> Option<String> {
alpha2_text::font_family(bytes, face_index)
}
#[wasm_bindgen(js_name = checkFont)]
pub fn check_font(bytes: &[u8], face_index: u32) -> Result<(), JsValue> {
alpha2_text::check_font(bytes, face_index).map_err(invalid_input)
}
#[wasm_bindgen(js_name = lintProject)]
pub fn lint_project(project_json: &str) -> Result<String, JsValue> {
let project = Project::from_json(project_json).map_err(|error| typed_error(&error))?;
serde_json::to_string(&project.lint()).map_err(internal_error)
}