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); let (_, res) = internal::compute_as_string(script, &mut mem)?;
82 Ok(res)
83}