adana_script_wasm/
lib.rs

1#![cfg(target_arch = "wasm32")]
2
3mod utils;
4use wasm_bindgen::prelude::*;
5
6#[global_allocator]
7static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
8
9mod internal {
10    use crate::utils;
11    use adana_script_core::primitive::{Primitive, RefPrimitive};
12    use std::collections::BTreeMap;
13    use wasm_bindgen::prelude::{JsError, JsValue};
14    fn compute(
15        script: &str,
16        mem: &mut [u8],
17    ) -> Result<(BTreeMap<String, RefPrimitive>, Primitive), JsError> {
18        utils::set_panic_hook();
19        let mut ctx: BTreeMap<String, RefPrimitive> = if !mem.is_empty() {
20            bincode::deserialize(mem)?
21        } else {
22            BTreeMap::new()
23        };
24
25        let result = adana_script::compute(script, &mut ctx, "N/A")
26            .map_err(|e| e.to_string())
27            .map_err(|e| JsError::new(&e))?;
28
29        Ok((ctx, result))
30    }
31    pub(super) fn compute_as_js_value(
32        script: &str,
33        mem: &mut [u8],
34    ) -> Result<(BTreeMap<String, RefPrimitive>, JsValue), JsError> {
35        let (ctx, result) = compute(script, mem)?;
36        let value = serde_wasm_bindgen::to_value(&result)?;
37
38        Ok((ctx, value))
39    }
40    pub(super) fn compute_as_string(
41        script: &str,
42        mem: &mut [u8],
43    ) -> Result<(BTreeMap<String, RefPrimitive>, String), JsError> {
44        let (ctx, result) = compute(script, mem)?;
45        Ok((ctx, result.to_string()))
46    }
47}
48
49#[wasm_bindgen]
50pub fn compute_as_js_value(
51    script: &str,
52    mem: &mut [u8],
53) -> Result<JsValue, JsError> {
54    let (ctx, res) = internal::compute_as_js_value(script, mem)?;
55    bincode::serialize_into(mem, &ctx)?;
56    Ok(res)
57}
58
59#[wasm_bindgen]
60pub fn compute_as_string(
61    script: &str,
62    mem: &mut [u8],
63) -> Result<String, JsError> {
64    let (ctx, res) = internal::compute_as_string(script, mem)?;
65    bincode::serialize_into(mem, &ctx)?;
66    Ok(res)
67}
68
69#[wasm_bindgen]
70pub fn make_ctx_and_compute_as_string(
71    script: &str,
72    heap_size_in_mb: Option<usize>,
73) -> Result<String, JsError> {
74    let heap_size =
75        if let Some(heap_size) = heap_size_in_mb.filter(|h| h <= &32) {
76            heap_size
77        } else {
78            1
79        };
80    let mut mem = Vec::with_capacity(heap_size * 1024 * 1024); // 1mb by default
81    let (_, res) = internal::compute_as_string(script, &mut mem)?;
82    Ok(res)
83}