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_layer = layer01.decode_all(&mut dec).map_err(|e| to_js_err(&e))?;
let parsed_geometry = parsed_layer.geometry_values().clone();
let (types_bytes, mlt_types_bytes): (Vec<u8>, Vec<u8>) = parsed_geometry
.vector_types()
.iter()
.map(|t| {
let mvt = match t {
GeometryType::Point | GeometryType::MultiPoint => 1,
GeometryType::LineString | GeometryType::MultiLineString => 2,
GeometryType::Polygon | GeometryType::MultiPolygon => 3,
#[allow(unreachable_patterns)]
_ => 0,
};
(mvt, *t as u8)
})
.unzip();
let types_array = Uint8Array::from(types_bytes.as_slice());
let mlt_types_array = Uint8Array::from(mlt_types_bytes.as_slice());
let tile = parsed_layer
.into_tile(&mut dec)
.map_err(|e| to_js_err(&e))?;
layers.push(DecodedLayer {
tile,
types_array,
mlt_types_array,
geometry: parsed_geometry,
});
}
Ok(MltTile { layers })
}
pub(crate) fn to_js_err(e: &MltError) -> JsError {
JsError::new(&e.to_string())
}