merge main
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "kcl-wasm-lib"
|
||||
version = "0.1.77"
|
||||
version = "0.1.79"
|
||||
edition = "2021"
|
||||
repository = "https://github.com/KittyCAD/modeling-app"
|
||||
rust-version = "1.83"
|
||||
|
||||
@ -3,9 +3,11 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use gloo_utils::format::JsValueSerdeExt;
|
||||
use kcl_lib::{wasm_engine::FileManager, EngineManager, Program};
|
||||
use kcl_lib::{wasm_engine::FileManager, EngineManager, ExecOutcome, KclError, KclErrorWithOutputs, Program};
|
||||
use wasm_bindgen::prelude::*;
|
||||
|
||||
const TRUE_BUG: &str = "This is a bug in KCL and not in your code, please report this to Zoo.";
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub struct Context {
|
||||
engine: Arc<Box<dyn EngineManager>>,
|
||||
@ -56,7 +58,7 @@ impl Context {
|
||||
return Ok(kcl_lib::ExecutorContext::new_mock(
|
||||
self.mock_engine.clone(),
|
||||
self.fs.clone(),
|
||||
settings.into(),
|
||||
settings,
|
||||
));
|
||||
}
|
||||
|
||||
@ -74,18 +76,39 @@ impl Context {
|
||||
program_ast_json: &str,
|
||||
path: Option<String>,
|
||||
settings: &str,
|
||||
) -> Result<JsValue, String> {
|
||||
) -> Result<JsValue, JsValue> {
|
||||
console_error_panic_hook::set_once();
|
||||
|
||||
let program: Program = serde_json::from_str(program_ast_json).map_err(|e| e.to_string())?;
|
||||
self.execute_typed(program_ast_json, path, settings)
|
||||
.await
|
||||
.and_then(|outcome| {
|
||||
JsValue::from_serde(&outcome).map_err(|e| {
|
||||
// The serde-wasm-bindgen does not work here because of weird HashMap issues.
|
||||
// DO NOT USE serde_wasm_bindgen::to_value it will break the frontend.
|
||||
KclErrorWithOutputs::no_outputs(KclError::internal(format!(
|
||||
"Could not serialize successful KCL result. {TRUE_BUG} Details: {e}"
|
||||
)))
|
||||
})
|
||||
})
|
||||
.map_err(|e: KclErrorWithOutputs| JsValue::from_serde(&e).unwrap())
|
||||
}
|
||||
|
||||
let ctx = self.create_executor_ctx(settings, path, false)?;
|
||||
match ctx.run_with_caching(program).await {
|
||||
// The serde-wasm-bindgen does not work here because of weird HashMap issues.
|
||||
// DO NOT USE serde_wasm_bindgen::to_value it will break the frontend.
|
||||
Ok(outcome) => JsValue::from_serde(&outcome).map_err(|e| e.to_string()),
|
||||
Err(err) => Err(serde_json::to_string(&err).map_err(|serde_err| serde_err.to_string())?),
|
||||
}
|
||||
async fn execute_typed(
|
||||
&self,
|
||||
program_ast_json: &str,
|
||||
path: Option<String>,
|
||||
settings: &str,
|
||||
) -> Result<ExecOutcome, KclErrorWithOutputs> {
|
||||
let program: Program = serde_json::from_str(program_ast_json).map_err(|e| {
|
||||
let err = KclError::internal(format!("Could not deserialize KCL AST. {TRUE_BUG} Details: {e}"));
|
||||
KclErrorWithOutputs::no_outputs(err)
|
||||
})?;
|
||||
let ctx = self.create_executor_ctx(settings, path, false).map_err(|e| {
|
||||
KclErrorWithOutputs::no_outputs(KclError::internal(format!(
|
||||
"Could not create KCL executor context. {TRUE_BUG} Details: {e}"
|
||||
)))
|
||||
})?;
|
||||
ctx.run_with_caching(program).await
|
||||
}
|
||||
|
||||
/// Reset the scene and bust the cache.
|
||||
@ -105,7 +128,7 @@ impl Context {
|
||||
|
||||
/// Send a response to kcl lib's engine.
|
||||
#[wasm_bindgen(js_name = sendResponse)]
|
||||
pub async fn send_response(&self, data: js_sys::Uint8Array) -> Result<(), JsValue> {
|
||||
pub async fn send_response(&self, data: js_sys::Uint8Array) {
|
||||
self.response_context.send_response(data).await
|
||||
}
|
||||
|
||||
@ -117,18 +140,40 @@ impl Context {
|
||||
path: Option<String>,
|
||||
settings: &str,
|
||||
use_prev_memory: bool,
|
||||
) -> Result<JsValue, String> {
|
||||
) -> Result<JsValue, JsValue> {
|
||||
console_error_panic_hook::set_once();
|
||||
|
||||
let program: Program = serde_json::from_str(program_ast_json).map_err(|e| e.to_string())?;
|
||||
self.execute_mock_typed(program_ast_json, path, settings, use_prev_memory)
|
||||
.await
|
||||
.and_then(|outcome| {
|
||||
JsValue::from_serde(&outcome).map_err(|e| {
|
||||
// The serde-wasm-bindgen does not work here because of weird HashMap issues.
|
||||
// DO NOT USE serde_wasm_bindgen::to_value it will break the frontend.
|
||||
KclErrorWithOutputs::no_outputs(KclError::internal(format!(
|
||||
"Could not serialize successful KCL result. {TRUE_BUG} Details: {e}"
|
||||
)))
|
||||
})
|
||||
})
|
||||
.map_err(|e: KclErrorWithOutputs| JsValue::from_serde(&e).unwrap())
|
||||
}
|
||||
|
||||
let ctx = self.create_executor_ctx(settings, path, true)?;
|
||||
match ctx.run_mock(program, use_prev_memory).await {
|
||||
// The serde-wasm-bindgen does not work here because of weird HashMap issues.
|
||||
// DO NOT USE serde_wasm_bindgen::to_value it will break the frontend.
|
||||
Ok(outcome) => JsValue::from_serde(&outcome).map_err(|e| e.to_string()),
|
||||
Err(err) => Err(serde_json::to_string(&err).map_err(|serde_err| serde_err.to_string())?),
|
||||
}
|
||||
async fn execute_mock_typed(
|
||||
&self,
|
||||
program_ast_json: &str,
|
||||
path: Option<String>,
|
||||
settings: &str,
|
||||
use_prev_memory: bool,
|
||||
) -> Result<ExecOutcome, KclErrorWithOutputs> {
|
||||
let program: Program = serde_json::from_str(program_ast_json).map_err(|e| {
|
||||
let err = KclError::internal(format!("Could not deserialize KCL AST. {TRUE_BUG} Details: {e}"));
|
||||
KclErrorWithOutputs::no_outputs(err)
|
||||
})?;
|
||||
let ctx = self.create_executor_ctx(settings, path, true).map_err(|e| {
|
||||
KclErrorWithOutputs::no_outputs(KclError::internal(format!(
|
||||
"Could not create KCL executor context. {TRUE_BUG} Details: {e}"
|
||||
)))
|
||||
})?;
|
||||
ctx.run_mock(program, use_prev_memory).await
|
||||
}
|
||||
|
||||
/// Export a scene to a file.
|
||||
|
||||
Reference in New Issue
Block a user