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}