mod geometry;
mod layer;
mod properties;
mod tile;
use js_sys::Uint8Array;
use layer::DecodedLayer;
use mlt_core::{Decoder, GeometryType, MltError, Parser};
use tile::MltTile;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn decode_tile(data: &[u8]) -> Result<MltTile, JsError> {
let mut parser = Parser::default();
let raw_layers = parser.parse_layers(data).map_err(|e| to_js_err(&e))?;
let mut dec = Decoder::default();
let mut layers = Vec::with_capacity(raw_layers.len());
for raw_layer in raw_layers {
let mlt_core::Layer::Tag01(layer01) = raw_layer else {
continue;
};
let parsed_geometry = layer01
.geometry
.clone()
.into_parsed(&mut dec)
.map_err(|e| to_js_err(&e))?;
let types_bytes: Vec<u8> = parsed_geometry
.vector_types()
.iter()
.map(|t| match t {
GeometryType::Point | GeometryType::MultiPoint => 1,
GeometryType::LineString | GeometryType::MultiLineString => 2,
GeometryType::Polygon | GeometryType::MultiPolygon => 3,
#[allow(unreachable_patterns)]
_ => 0,
})
.collect();
let types_array = Uint8Array::from(types_bytes.as_slice());
let tile = layer01.into_tile(&mut dec).map_err(|e| to_js_err(&e))?;
layers.push(DecodedLayer {
tile,
types_array,
geometry: parsed_geometry,
});
}
Ok(MltTile { layers })
}
pub(crate) fn to_js_err(e: &MltError) -> JsError {
JsError::new(&e.to_string())
}