1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#![cfg(target_arch = "wasm32")]

mod utils;
use wasm_bindgen::prelude::*;

#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

mod internal {
    use crate::utils;
    use adana_script_core::primitive::{Primitive, RefPrimitive};
    use std::collections::BTreeMap;
    use wasm_bindgen::prelude::{JsError, JsValue};
    fn compute(
        script: &str,
        mem: &mut [u8],
    ) -> Result<(BTreeMap<String, RefPrimitive>, Primitive), JsError> {
        utils::set_panic_hook();
        let mut ctx: BTreeMap<String, RefPrimitive> = if !mem.is_empty() {
            bincode::deserialize(mem)?
        } else {
            BTreeMap::new()
        };

        let result = adana_script::compute(script, &mut ctx, "N/A")
            .map_err(|e| e.to_string())
            .map_err(|e| JsError::new(&e))?;

        Ok((ctx, result))
    }
    pub(super) fn compute_as_js_value(
        script: &str,
        mem: &mut [u8],
    ) -> Result<(BTreeMap<String, RefPrimitive>, JsValue), JsError> {
        let (ctx, result) = compute(script, mem)?;
        let value = serde_wasm_bindgen::to_value(&result)?;

        Ok((ctx, value))
    }
    pub(super) fn compute_as_string(
        script: &str,
        mem: &mut [u8],
    ) -> Result<(BTreeMap<String, RefPrimitive>, String), JsError> {
        let (ctx, result) = compute(script, mem)?;
        Ok((ctx, result.to_string()))
    }
}

#[wasm_bindgen]
pub fn compute_as_js_value(
    script: &str,
    mem: &mut [u8],
) -> Result<JsValue, JsError> {
    let (ctx, res) = internal::compute_as_js_value(script, mem)?;
    bincode::serialize_into(mem, &ctx)?;
    Ok(res)
}

#[wasm_bindgen]
pub fn compute_as_string(
    script: &str,
    mem: &mut [u8],
) -> Result<String, JsError> {
    let (ctx, res) = internal::compute_as_string(script, mem)?;
    bincode::serialize_into(mem, &ctx)?;
    Ok(res)
}

#[wasm_bindgen]
pub fn make_ctx_and_compute_as_string(
    script: &str,
    heap_size_in_mb: Option<usize>,
) -> Result<String, JsError> {
    let heap_size =
        if let Some(heap_size) = heap_size_in_mb.filter(|h| h <= &32) {
            heap_size
        } else {
            1
        };
    let mut mem = Vec::with_capacity(heap_size * 1024 * 1024); // 1mb by default
    let (_, res) = internal::compute_as_string(script, &mut mem)?;
    Ok(res)
}