Skip to main content

ui_grid_wasm/
lib.rs

1use serde::de::DeserializeOwned;
2use wasm_bindgen::prelude::*;
3
4use ui_grid_core::{
5    export::export_csv_rows,
6    models::{BuildGridPipelineContext, GridColumnDef, GridRow},
7    pipeline::build_grid_pipeline,
8    state::{BuildGridSavedStateContext, build_grid_saved_state, normalize_grid_saved_state},
9};
10use ui_grid_virtualization::{VirtualWindowRequest, calculate_virtual_window};
11
12fn from_js<T: DeserializeOwned>(value: JsValue) -> Result<T, JsValue> {
13    serde_wasm_bindgen::from_value(value)
14        .map_err(|error| JsValue::from_str(&format!("failed to decode wasm input: {error}")))
15}
16
17fn to_js<T: serde::Serialize>(value: &T) -> Result<JsValue, JsValue> {
18    let serializer = serde_wasm_bindgen::Serializer::json_compatible();
19    value
20        .serialize(&serializer)
21        .map_err(|error| JsValue::from_str(&format!("failed to encode wasm output: {error}")))
22}
23
24#[wasm_bindgen(start)]
25pub fn start() {
26    console_error_panic_hook::set_once();
27}
28
29#[wasm_bindgen]
30pub fn version() -> String {
31    env!("CARGO_PKG_VERSION").to_string()
32}
33
34#[wasm_bindgen]
35pub fn build_pipeline_js(context: JsValue) -> Result<JsValue, JsValue> {
36    let context: BuildGridPipelineContext = from_js(context)?;
37    let result = build_grid_pipeline(&context);
38    to_js(&result)
39}
40
41#[wasm_bindgen]
42pub fn export_csv_rows_js(columns: JsValue, rows: JsValue) -> Result<String, JsValue> {
43    let columns: Vec<GridColumnDef> = from_js(columns)?;
44    let rows: Vec<GridRow> = from_js(rows)?;
45    Ok(export_csv_rows(&columns, &rows))
46}
47
48#[wasm_bindgen]
49pub fn build_saved_state_js(context: JsValue) -> Result<JsValue, JsValue> {
50    let context: BuildGridSavedStateContext = from_js(context)?;
51    let result = build_grid_saved_state(context);
52    to_js(&result)
53}
54
55#[wasm_bindgen]
56pub fn normalize_saved_state_js(state: JsValue) -> Result<JsValue, JsValue> {
57    let state: serde_json::Value = from_js(state)?;
58    let result = normalize_grid_saved_state(&state);
59    to_js(&result)
60}
61
62#[wasm_bindgen]
63pub fn calculate_virtual_window_js(request: JsValue) -> Result<JsValue, JsValue> {
64    let request: VirtualWindowRequest = from_js(request)?;
65    let result = calculate_virtual_window(&request);
66    to_js(&result)
67}