diff --git a/src/wasm-lib/derive-docs/src/lib.rs b/src/wasm-lib/derive-docs/src/lib.rs index 31f019cc1..3fbfd8043 100644 --- a/src/wasm-lib/derive-docs/src/lib.rs +++ b/src/wasm-lib/derive-docs/src/lib.rs @@ -815,7 +815,7 @@ fn generate_code_block_test(fn_name: &str, code_block: &str, index: usize) -> pr context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new(&ctx.settings)).await { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", #fn_name, #index), diff --git a/src/wasm-lib/derive-docs/tests/args_with_lifetime.gen b/src/wasm-lib/derive-docs/tests/args_with_lifetime.gen index 4b173c3bf..72fbd96b0 100644 --- a/src/wasm-lib/derive-docs/tests/args_with_lifetime.gen +++ b/src/wasm-lib/derive-docs/tests/args_with_lifetime.gen @@ -14,7 +14,10 @@ mod test_examples_someFn { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "someFn", 0usize), diff --git a/src/wasm-lib/derive-docs/tests/args_with_refs.gen b/src/wasm-lib/derive-docs/tests/args_with_refs.gen index cb2ea7782..bfce2913c 100644 --- a/src/wasm-lib/derive-docs/tests/args_with_refs.gen +++ b/src/wasm-lib/derive-docs/tests/args_with_refs.gen @@ -14,7 +14,10 @@ mod test_examples_someFn { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "someFn", 0usize), diff --git a/src/wasm-lib/derive-docs/tests/array.gen b/src/wasm-lib/derive-docs/tests/array.gen index 50f9dde51..70ce2ee2b 100644 --- a/src/wasm-lib/derive-docs/tests/array.gen +++ b/src/wasm-lib/derive-docs/tests/array.gen @@ -15,7 +15,10 @@ mod test_examples_show { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "show", 0usize), @@ -69,7 +72,10 @@ mod test_examples_show { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "show", 1usize), diff --git a/src/wasm-lib/derive-docs/tests/box.gen b/src/wasm-lib/derive-docs/tests/box.gen index 06f4ff516..30df8bb06 100644 --- a/src/wasm-lib/derive-docs/tests/box.gen +++ b/src/wasm-lib/derive-docs/tests/box.gen @@ -15,7 +15,10 @@ mod test_examples_show { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "show", 0usize), diff --git a/src/wasm-lib/derive-docs/tests/doc_comment_with_code.gen b/src/wasm-lib/derive-docs/tests/doc_comment_with_code.gen index 04b74ec1b..1939b0713 100644 --- a/src/wasm-lib/derive-docs/tests/doc_comment_with_code.gen +++ b/src/wasm-lib/derive-docs/tests/doc_comment_with_code.gen @@ -16,7 +16,10 @@ mod test_examples_my_func { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "my_func", 0usize), @@ -70,7 +73,10 @@ mod test_examples_my_func { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "my_func", 1usize), diff --git a/src/wasm-lib/derive-docs/tests/lineTo.gen b/src/wasm-lib/derive-docs/tests/lineTo.gen index 4506b61ef..5e5b03007 100644 --- a/src/wasm-lib/derive-docs/tests/lineTo.gen +++ b/src/wasm-lib/derive-docs/tests/lineTo.gen @@ -16,7 +16,10 @@ mod test_examples_line_to { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "line_to", 0usize), @@ -70,7 +73,10 @@ mod test_examples_line_to { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "line_to", 1usize), diff --git a/src/wasm-lib/derive-docs/tests/min.gen b/src/wasm-lib/derive-docs/tests/min.gen index f6a83722d..891ef69fd 100644 --- a/src/wasm-lib/derive-docs/tests/min.gen +++ b/src/wasm-lib/derive-docs/tests/min.gen @@ -15,7 +15,10 @@ mod test_examples_min { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "min", 0usize), @@ -69,7 +72,10 @@ mod test_examples_min { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "min", 1usize), diff --git a/src/wasm-lib/derive-docs/tests/option.gen b/src/wasm-lib/derive-docs/tests/option.gen index 95ed6f310..cb71948ad 100644 --- a/src/wasm-lib/derive-docs/tests/option.gen +++ b/src/wasm-lib/derive-docs/tests/option.gen @@ -15,7 +15,10 @@ mod test_examples_show { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "show", 0usize), diff --git a/src/wasm-lib/derive-docs/tests/option_input_format.gen b/src/wasm-lib/derive-docs/tests/option_input_format.gen index d7d3b51dc..ef01610da 100644 --- a/src/wasm-lib/derive-docs/tests/option_input_format.gen +++ b/src/wasm-lib/derive-docs/tests/option_input_format.gen @@ -15,7 +15,10 @@ mod test_examples_import { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "import", 0usize), diff --git a/src/wasm-lib/derive-docs/tests/return_vec_box_sketch.gen b/src/wasm-lib/derive-docs/tests/return_vec_box_sketch.gen index 2093acf64..3c366d6ea 100644 --- a/src/wasm-lib/derive-docs/tests/return_vec_box_sketch.gen +++ b/src/wasm-lib/derive-docs/tests/return_vec_box_sketch.gen @@ -15,7 +15,10 @@ mod test_examples_import { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "import", 0usize), diff --git a/src/wasm-lib/derive-docs/tests/return_vec_sketch.gen b/src/wasm-lib/derive-docs/tests/return_vec_sketch.gen index 352ec49a9..5fd19aceb 100644 --- a/src/wasm-lib/derive-docs/tests/return_vec_sketch.gen +++ b/src/wasm-lib/derive-docs/tests/return_vec_sketch.gen @@ -15,7 +15,10 @@ mod test_examples_import { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "import", 0usize), diff --git a/src/wasm-lib/derive-docs/tests/show.gen b/src/wasm-lib/derive-docs/tests/show.gen index d32d1b79d..99c412663 100644 --- a/src/wasm-lib/derive-docs/tests/show.gen +++ b/src/wasm-lib/derive-docs/tests/show.gen @@ -15,7 +15,10 @@ mod test_examples_show { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "show", 0usize), diff --git a/src/wasm-lib/derive-docs/tests/test_args_with_exec_state.gen b/src/wasm-lib/derive-docs/tests/test_args_with_exec_state.gen index eb63bdfd8..409b870f7 100644 --- a/src/wasm-lib/derive-docs/tests/test_args_with_exec_state.gen +++ b/src/wasm-lib/derive-docs/tests/test_args_with_exec_state.gen @@ -14,7 +14,10 @@ mod test_examples_some_function { settings: Default::default(), context_type: crate::execution::ContextType::Mock, }; - if let Err(e) = ctx.run(program.into(), &mut crate::ExecState::new()).await { + if let Err(e) = ctx + .run(program.into(), &mut crate::ExecState::new(&ctx.settings)) + .await + { return Err(miette::Report::new(crate::errors::Report { error: e, filename: format!("{}{}", "some_function", 0usize), diff --git a/src/wasm-lib/kcl-test-server/src/lib.rs b/src/wasm-lib/kcl-test-server/src/lib.rs index 35de21def..f5c1e6e94 100644 --- a/src/wasm-lib/kcl-test-server/src/lib.rs +++ b/src/wasm-lib/kcl-test-server/src/lib.rs @@ -164,7 +164,7 @@ async fn snapshot_endpoint(body: Bytes, state: ExecutorContext) -> Response Result { let ctx = ExecutorContext::new_forwarded_mock(Arc::new(Box::new( crate::conn_mock_core::EngineConnection::new(ref_result).await?, ))); - ctx.run(program.into(), &mut ExecState::new()).await?; + ctx.run(program.into(), &mut ExecState::new(&ctx.settings)).await?; let result = result.lock().expect("mutex lock").clone(); Ok(result) diff --git a/src/wasm-lib/kcl/src/errors.rs b/src/wasm-lib/kcl/src/errors.rs index ad7357d6e..32f7cbd76 100644 --- a/src/wasm-lib/kcl/src/errors.rs +++ b/src/wasm-lib/kcl/src/errors.rs @@ -30,13 +30,16 @@ impl From for ExecError { #[derive(Debug)] pub struct ExecErrorWithState { pub error: ExecError, - pub exec_state: crate::ExecState, + pub exec_state: Option, } impl ExecErrorWithState { #[cfg_attr(target_arch = "wasm32", expect(dead_code))] pub fn new(error: ExecError, exec_state: crate::ExecState) -> Self { - Self { error, exec_state } + Self { + error, + exec_state: Some(exec_state), + } } } @@ -44,7 +47,7 @@ impl From for ExecErrorWithState { fn from(error: ExecError) -> Self { Self { error, - exec_state: Default::default(), + exec_state: None, } } } @@ -53,7 +56,7 @@ impl From for ExecErrorWithState { fn from(error: ConnectionError) -> Self { Self { error: error.into(), - exec_state: Default::default(), + exec_state: None, } } } diff --git a/src/wasm-lib/kcl/src/execution/kcl_value.rs b/src/wasm-lib/kcl/src/execution/kcl_value.rs index 96815060e..8e1e18a1f 100644 --- a/src/wasm-lib/kcl/src/execution/kcl_value.rs +++ b/src/wasm-lib/kcl/src/execution/kcl_value.rs @@ -601,10 +601,24 @@ impl TryFrom for UnitLen { } } -#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Eq)] +impl From for UnitLen { + fn from(unit: crate::UnitLength) -> Self { + match unit { + crate::UnitLength::Cm => UnitLen::Cm, + crate::UnitLength::Ft => UnitLen::Feet, + crate::UnitLength::In => UnitLen::Inches, + crate::UnitLength::M => UnitLen::M, + crate::UnitLength::Mm => UnitLen::Mm, + crate::UnitLength::Yd => UnitLen::Yards, + } + } +} + +#[derive(Debug, Default, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Eq)] #[ts(export)] #[serde(tag = "type")] pub enum UnitAngle { + #[default] Degrees, Radians, } diff --git a/src/wasm-lib/kcl/src/execution/mod.rs b/src/wasm-lib/kcl/src/execution/mod.rs index 7036b4b16..24b741f22 100644 --- a/src/wasm-lib/kcl/src/execution/mod.rs +++ b/src/wasm-lib/kcl/src/execution/mod.rs @@ -21,7 +21,7 @@ type Point2D = kcmc::shared::Point2d; type Point3D = kcmc::shared::Point3d; pub use function_param::FunctionParam; -pub use kcl_value::{KclObjectFields, KclValue}; +pub use kcl_value::{KclObjectFields, KclValue, UnitAngle, UnitLen}; use uuid::Uuid; mod annotations; @@ -77,7 +77,7 @@ pub struct GlobalState { pub artifact_commands: Vec, } -#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct ModuleState { /// Program variable bindings. @@ -115,21 +115,15 @@ pub struct ExecOutcome { pub artifact_commands: Vec, } -impl Default for ExecState { - fn default() -> Self { - Self::new() - } -} - impl ExecState { - pub fn new() -> Self { + pub fn new(exec_settings: &ExecutorSettings) -> Self { ExecState { global: GlobalState::new(), - mod_local: ModuleState::default(), + mod_local: ModuleState::new(exec_settings), } } - fn reset(&mut self) { + fn reset(&mut self, exec_settings: &ExecutorSettings) { let mut id_generator = self.global.id_generator.clone(); // We do not pop the ids, since we want to keep the same id generator. // This is for the front end to keep track of the ids. @@ -140,7 +134,7 @@ impl ExecState { *self = ExecState { global, - mod_local: ModuleState::default(), + mod_local: ModuleState::new(exec_settings), }; } @@ -204,6 +198,14 @@ impl ExecState { Ok(id) } + + pub fn length_unit(&self) -> UnitLen { + self.mod_local.settings.default_length_units + } + + pub fn angle_unit(&self) -> UnitAngle { + self.mod_local.settings.default_angle_units + } } impl GlobalState { @@ -232,6 +234,23 @@ impl GlobalState { } } +impl ModuleState { + fn new(exec_settings: &ExecutorSettings) -> Self { + ModuleState { + memory: Default::default(), + dynamic_state: Default::default(), + pipe_value: Default::default(), + module_exports: Default::default(), + import_stack: Default::default(), + operations: Default::default(), + settings: MetaSettings { + default_length_units: exec_settings.units.into(), + default_angle_units: Default::default(), + }, + } + } +} + #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(rename_all = "camelCase")] @@ -240,15 +259,6 @@ pub struct MetaSettings { pub default_angle_units: kcl_value::UnitAngle, } -impl Default for MetaSettings { - fn default() -> Self { - MetaSettings { - default_length_units: kcl_value::UnitLen::Mm, - default_angle_units: kcl_value::UnitAngle::Degrees, - } - } -} - impl MetaSettings { fn update_from_annotation(&mut self, annotation: &NonCodeValue, source_range: SourceRange) -> Result<(), KclError> { let properties = annotations::expect_properties(annotations::SETTINGS, annotation, source_range)?; @@ -1711,7 +1721,7 @@ pub struct ExecutorContext { #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] pub struct ExecutorSettings { - /// The unit to use in modeling dimensions. + /// The project-default unit to use in modeling dimensions. pub units: UnitLength, /// Highlight edges of 3D objects? pub highlight_edges: bool, @@ -2214,7 +2224,7 @@ impl ExecutorContext { if cache_result.clear_scene && !self.is_mock() { // Pop the execution state, since we are starting fresh. - exec_state.reset(); + exec_state.reset(&self.settings); // We don't do this in mock mode since there is no engine connection // anyways and from the TS side we override memory and don't want to clear it. @@ -2457,7 +2467,7 @@ impl ExecutorContext { let mut local_state = ModuleState { import_stack: exec_state.mod_local.import_stack.clone(), - ..Default::default() + ..ModuleState::new(&self.settings) }; local_state.import_stack.push(info.path.clone()); std::mem::swap(&mut exec_state.mod_local, &mut local_state); @@ -2830,7 +2840,7 @@ mod tests { settings: Default::default(), context_type: ContextType::Mock, }; - let mut exec_state = ExecState::default(); + let mut exec_state = ExecState::new(&ctx.settings); ctx.run(program.clone().into(), &mut exec_state).await?; Ok((program, ctx, exec_state)) @@ -3302,6 +3312,25 @@ let shape = layer() |> patternTransform(10, transform, %) assert_eq!(7.4, mem_get_json(exec_state.memory(), "thing").as_f64().unwrap()); } + #[tokio::test(flavor = "multi_thread")] + async fn test_unit_default() { + let ast = r#"const inMm = 25.4 * mm() +const inInches = 1.0 * inch()"#; + let (_, _, exec_state) = parse_execute(ast).await.unwrap(); + assert_eq!(25.4, mem_get_json(exec_state.memory(), "inMm").as_f64().unwrap()); + assert_eq!(25.4, mem_get_json(exec_state.memory(), "inInches").as_f64().unwrap()); + } + + #[tokio::test(flavor = "multi_thread")] + async fn test_unit_overriden() { + let ast = r#"@settings(defaultLengthUnit = inch) +const inMm = 25.4 * mm() +const inInches = 1.0 * inch()"#; + let (_, _, exec_state) = parse_execute(ast).await.unwrap(); + assert_eq!(1.0, mem_get_json(exec_state.memory(), "inMm").as_f64().unwrap().round()); + assert_eq!(1.0, mem_get_json(exec_state.memory(), "inInches").as_f64().unwrap()); + } + #[tokio::test(flavor = "multi_thread")] async fn test_zero_param_fn() { let ast = r#"const sigmaAllow = 35000 // psi @@ -4045,7 +4074,7 @@ shell({ faces = ['end'], thickness = 0.25 }, firstSketch)"#; .unwrap(); let old_program = crate::Program::parse_no_errs(code).unwrap(); // Execute the program. - let mut exec_state = Default::default(); + let mut exec_state = ExecState::new(&ctx.settings); let cache_info = crate::CacheInformation { old: None, new_ast: old_program.ast.clone(), diff --git a/src/wasm-lib/kcl/src/lsp/kcl/mod.rs b/src/wasm-lib/kcl/src/lsp/kcl/mod.rs index 3fce0efff..0c253ebcd 100644 --- a/src/wasm-lib/kcl/src/lsp/kcl/mod.rs +++ b/src/wasm-lib/kcl/src/lsp/kcl/mod.rs @@ -49,7 +49,7 @@ use crate::{ token::TokenStream, PIPE_OPERATOR, }, - CacheInformation, ModuleId, OldAstState, Program, SourceRange, + CacheInformation, ExecState, ModuleId, OldAstState, Program, SourceRange, }; const SEMANTIC_TOKEN_TYPES: [SemanticTokenType; 10] = [ SemanticTokenType::NUMBER, @@ -693,7 +693,7 @@ impl Backend { let mut exec_state = if let Some(last_successful_ast_state) = last_successful_ast_state.clone() { last_successful_ast_state.exec_state } else { - Default::default() + ExecState::new(&executor_ctx.settings) }; if let Err(err) = executor_ctx diff --git a/src/wasm-lib/kcl/src/std/args.rs b/src/wasm-lib/kcl/src/std/args.rs index eb54c045b..6ef9b4d2a 100644 --- a/src/wasm-lib/kcl/src/std/args.rs +++ b/src/wasm-lib/kcl/src/std/args.rs @@ -96,25 +96,6 @@ impl Args { } } - #[cfg(test)] - pub(crate) async fn new_test_args() -> Result { - use std::sync::Arc; - - Ok(Self { - args: Vec::new(), - kw_args: Default::default(), - source_range: SourceRange::default(), - ctx: ExecutorContext { - engine: Arc::new(Box::new(crate::engine::conn_mock::EngineConnection::new().await?)), - fs: Arc::new(crate::fs::FileManager::new()), - stdlib: Arc::new(crate::std::StdLib::new()), - settings: Default::default(), - context_type: crate::execution::ContextType::Mock, - }, - pipe_value: None, - }) - } - /// Get a keyword argument. If not set, returns None. pub(crate) fn get_kw_arg_opt<'a, T>(&'a self, label: &str) -> Option where diff --git a/src/wasm-lib/kcl/src/std/units.rs b/src/wasm-lib/kcl/src/std/units.rs index 540b1051d..9ad64a4a7 100644 --- a/src/wasm-lib/kcl/src/std/units.rs +++ b/src/wasm-lib/kcl/src/std/units.rs @@ -5,14 +5,13 @@ use derive_docs::stdlib; use crate::{ errors::KclError, - execution::{ExecState, KclValue}, - settings::types::UnitLength, + execution::{ExecState, KclValue, UnitLen}, std::Args, }; /// Millimeters conversion factor for current projects units. -pub async fn mm(_exec_state: &mut ExecState, args: Args) -> Result { - let result = inner_mm(&args)?; +pub async fn mm(exec_state: &mut ExecState, args: Args) -> Result { + let result = inner_mm(exec_state)?; Ok(args.make_user_val_from_f64(result)) } @@ -40,20 +39,20 @@ pub async fn mm(_exec_state: &mut ExecState, args: Args) -> Result Result { - match args.ctx.settings.units { - UnitLength::Mm => Ok(1.0), - UnitLength::In => Ok(measurements::Length::from_millimeters(1.0).as_inches()), - UnitLength::Ft => Ok(measurements::Length::from_millimeters(1.0).as_feet()), - UnitLength::M => Ok(measurements::Length::from_millimeters(1.0).as_meters()), - UnitLength::Cm => Ok(measurements::Length::from_millimeters(1.0).as_centimeters()), - UnitLength::Yd => Ok(measurements::Length::from_millimeters(1.0).as_yards()), +fn inner_mm(exec_state: &ExecState) -> Result { + match exec_state.length_unit() { + UnitLen::Mm => Ok(1.0), + UnitLen::Inches => Ok(measurements::Length::from_millimeters(1.0).as_inches()), + UnitLen::Feet => Ok(measurements::Length::from_millimeters(1.0).as_feet()), + UnitLen::M => Ok(measurements::Length::from_millimeters(1.0).as_meters()), + UnitLen::Cm => Ok(measurements::Length::from_millimeters(1.0).as_centimeters()), + UnitLen::Yards => Ok(measurements::Length::from_millimeters(1.0).as_yards()), } } /// Inches conversion factor for current projects units. -pub async fn inch(_exec_state: &mut ExecState, args: Args) -> Result { - let result = inner_inch(&args)?; +pub async fn inch(exec_state: &mut ExecState, args: Args) -> Result { + let result = inner_inch(exec_state)?; Ok(args.make_user_val_from_f64(result)) } @@ -81,20 +80,20 @@ pub async fn inch(_exec_state: &mut ExecState, args: Args) -> Result Result { - match args.ctx.settings.units { - UnitLength::Mm => Ok(measurements::Length::from_inches(1.0).as_millimeters()), - UnitLength::In => Ok(1.0), - UnitLength::Ft => Ok(measurements::Length::from_inches(1.0).as_feet()), - UnitLength::M => Ok(measurements::Length::from_inches(1.0).as_meters()), - UnitLength::Cm => Ok(measurements::Length::from_inches(1.0).as_centimeters()), - UnitLength::Yd => Ok(measurements::Length::from_inches(1.0).as_yards()), +fn inner_inch(exec_state: &ExecState) -> Result { + match exec_state.length_unit() { + UnitLen::Mm => Ok(measurements::Length::from_inches(1.0).as_millimeters()), + UnitLen::Inches => Ok(1.0), + UnitLen::Feet => Ok(measurements::Length::from_inches(1.0).as_feet()), + UnitLen::M => Ok(measurements::Length::from_inches(1.0).as_meters()), + UnitLen::Cm => Ok(measurements::Length::from_inches(1.0).as_centimeters()), + UnitLen::Yards => Ok(measurements::Length::from_inches(1.0).as_yards()), } } /// Feet conversion factor for current projects units. -pub async fn ft(_exec_state: &mut ExecState, args: Args) -> Result { - let result = inner_ft(&args)?; +pub async fn ft(exec_state: &mut ExecState, args: Args) -> Result { + let result = inner_ft(exec_state)?; Ok(args.make_user_val_from_f64(result)) } @@ -123,20 +122,20 @@ pub async fn ft(_exec_state: &mut ExecState, args: Args) -> Result Result { - match args.ctx.settings.units { - UnitLength::Mm => Ok(measurements::Length::from_feet(1.0).as_millimeters()), - UnitLength::In => Ok(measurements::Length::from_feet(1.0).as_inches()), - UnitLength::Ft => Ok(1.0), - UnitLength::M => Ok(measurements::Length::from_feet(1.0).as_meters()), - UnitLength::Cm => Ok(measurements::Length::from_feet(1.0).as_centimeters()), - UnitLength::Yd => Ok(measurements::Length::from_feet(1.0).as_yards()), +fn inner_ft(exec_state: &ExecState) -> Result { + match exec_state.length_unit() { + UnitLen::Mm => Ok(measurements::Length::from_feet(1.0).as_millimeters()), + UnitLen::Inches => Ok(measurements::Length::from_feet(1.0).as_inches()), + UnitLen::Feet => Ok(1.0), + UnitLen::M => Ok(measurements::Length::from_feet(1.0).as_meters()), + UnitLen::Cm => Ok(measurements::Length::from_feet(1.0).as_centimeters()), + UnitLen::Yards => Ok(measurements::Length::from_feet(1.0).as_yards()), } } /// Meters conversion factor for current projects units. -pub async fn m(_exec_state: &mut ExecState, args: Args) -> Result { - let result = inner_m(&args)?; +pub async fn m(exec_state: &mut ExecState, args: Args) -> Result { + let result = inner_m(exec_state)?; Ok(args.make_user_val_from_f64(result)) } @@ -165,20 +164,20 @@ pub async fn m(_exec_state: &mut ExecState, args: Args) -> Result Result { - match args.ctx.settings.units { - UnitLength::Mm => Ok(measurements::Length::from_meters(1.0).as_millimeters()), - UnitLength::In => Ok(measurements::Length::from_meters(1.0).as_inches()), - UnitLength::Ft => Ok(measurements::Length::from_meters(1.0).as_feet()), - UnitLength::M => Ok(1.0), - UnitLength::Cm => Ok(measurements::Length::from_meters(1.0).as_centimeters()), - UnitLength::Yd => Ok(measurements::Length::from_meters(1.0).as_yards()), +fn inner_m(exec_state: &ExecState) -> Result { + match exec_state.length_unit() { + UnitLen::Mm => Ok(measurements::Length::from_meters(1.0).as_millimeters()), + UnitLen::Inches => Ok(measurements::Length::from_meters(1.0).as_inches()), + UnitLen::Feet => Ok(measurements::Length::from_meters(1.0).as_feet()), + UnitLen::M => Ok(1.0), + UnitLen::Cm => Ok(measurements::Length::from_meters(1.0).as_centimeters()), + UnitLen::Yards => Ok(measurements::Length::from_meters(1.0).as_yards()), } } /// Centimeters conversion factor for current projects units. -pub async fn cm(_exec_state: &mut ExecState, args: Args) -> Result { - let result = inner_cm(&args)?; +pub async fn cm(exec_state: &mut ExecState, args: Args) -> Result { + let result = inner_cm(exec_state)?; Ok(args.make_user_val_from_f64(result)) } @@ -207,20 +206,20 @@ pub async fn cm(_exec_state: &mut ExecState, args: Args) -> Result Result { - match args.ctx.settings.units { - UnitLength::Mm => Ok(measurements::Length::from_centimeters(1.0).as_millimeters()), - UnitLength::In => Ok(measurements::Length::from_centimeters(1.0).as_inches()), - UnitLength::Ft => Ok(measurements::Length::from_centimeters(1.0).as_feet()), - UnitLength::M => Ok(measurements::Length::from_centimeters(1.0).as_meters()), - UnitLength::Cm => Ok(1.0), - UnitLength::Yd => Ok(measurements::Length::from_centimeters(1.0).as_yards()), +fn inner_cm(exec_state: &ExecState) -> Result { + match exec_state.length_unit() { + UnitLen::Mm => Ok(measurements::Length::from_centimeters(1.0).as_millimeters()), + UnitLen::Inches => Ok(measurements::Length::from_centimeters(1.0).as_inches()), + UnitLen::Feet => Ok(measurements::Length::from_centimeters(1.0).as_feet()), + UnitLen::M => Ok(measurements::Length::from_centimeters(1.0).as_meters()), + UnitLen::Cm => Ok(1.0), + UnitLen::Yards => Ok(measurements::Length::from_centimeters(1.0).as_yards()), } } /// Yards conversion factor for current projects units. -pub async fn yd(_exec_state: &mut ExecState, args: Args) -> Result { - let result = inner_yd(&args)?; +pub async fn yd(exec_state: &mut ExecState, args: Args) -> Result { + let result = inner_yd(exec_state)?; Ok(args.make_user_val_from_f64(result)) } @@ -249,92 +248,13 @@ pub async fn yd(_exec_state: &mut ExecState, args: Args) -> Result Result { - match args.ctx.settings.units { - UnitLength::Mm => Ok(measurements::Length::from_yards(1.0).as_millimeters()), - UnitLength::In => Ok(measurements::Length::from_yards(1.0).as_inches()), - UnitLength::Ft => Ok(measurements::Length::from_yards(1.0).as_feet()), - UnitLength::M => Ok(measurements::Length::from_yards(1.0).as_meters()), - UnitLength::Cm => Ok(measurements::Length::from_yards(1.0).as_centimeters()), - UnitLength::Yd => Ok(1.0), - } -} - -#[cfg(test)] -mod tests { - use pretty_assertions::assert_eq; - - use super::*; - - #[tokio::test(flavor = "multi_thread")] - async fn test_units_inner_mm() { - let mut args = Args::new_test_args().await.unwrap(); - args.ctx.settings.units = UnitLength::Mm; - let result = inner_mm(&args).unwrap(); - assert_eq!(result, 1.0); - - args.ctx.settings.units = UnitLength::In; - let result = inner_mm(&args).unwrap(); - assert_eq!(result, 1.0 / 25.4); - } - - #[tokio::test(flavor = "multi_thread")] - async fn test_units_inner_inch() { - let mut args = Args::new_test_args().await.unwrap(); - args.ctx.settings.units = UnitLength::In; - let result = inner_inch(&args).unwrap(); - assert_eq!(result, 1.0); - - args.ctx.settings.units = UnitLength::Mm; - let result = inner_inch(&args).unwrap(); - assert_eq!(result, 25.4); - } - - #[tokio::test(flavor = "multi_thread")] - async fn test_units_inner_ft() { - let mut args = Args::new_test_args().await.unwrap(); - args.ctx.settings.units = UnitLength::Ft; - let result = inner_ft(&args).unwrap(); - assert_eq!(result, 1.0); - - args.ctx.settings.units = UnitLength::Mm; - let result = inner_ft(&args).unwrap(); - assert_eq!(result, 304.8); - } - - #[tokio::test(flavor = "multi_thread")] - async fn test_units_inner_m() { - let mut args = Args::new_test_args().await.unwrap(); - args.ctx.settings.units = UnitLength::M; - let result = inner_m(&args).unwrap(); - assert_eq!(result, 1.0); - - args.ctx.settings.units = UnitLength::Mm; - let result = inner_m(&args).unwrap(); - assert_eq!(result, 1000.0); - } - - #[tokio::test(flavor = "multi_thread")] - async fn test_units_inner_cm() { - let mut args = Args::new_test_args().await.unwrap(); - args.ctx.settings.units = UnitLength::Cm; - let result = inner_cm(&args).unwrap(); - assert_eq!(result, 1.0); - - args.ctx.settings.units = UnitLength::Mm; - let result = inner_cm(&args).unwrap(); - assert_eq!(result, 10.0); - } - - #[tokio::test(flavor = "multi_thread")] - async fn test_units_inner_yd() { - let mut args = Args::new_test_args().await.unwrap(); - args.ctx.settings.units = UnitLength::Yd; - let result = inner_yd(&args).unwrap(); - assert_eq!(result, 1.0); - - args.ctx.settings.units = UnitLength::Mm; - let result = inner_yd(&args).unwrap(); - assert_eq!(result, 914.4); +fn inner_yd(exec_state: &ExecState) -> Result { + match exec_state.length_unit() { + UnitLen::Mm => Ok(measurements::Length::from_yards(1.0).as_millimeters()), + UnitLen::Inches => Ok(measurements::Length::from_yards(1.0).as_inches()), + UnitLen::Feet => Ok(measurements::Length::from_yards(1.0).as_feet()), + UnitLen::M => Ok(measurements::Length::from_yards(1.0).as_meters()), + UnitLen::Cm => Ok(measurements::Length::from_yards(1.0).as_centimeters()), + UnitLen::Yards => Ok(1.0), } } diff --git a/src/wasm-lib/kcl/src/test_server.rs b/src/wasm-lib/kcl/src/test_server.rs index e768c938c..716de3a99 100644 --- a/src/wasm-lib/kcl/src/test_server.rs +++ b/src/wasm-lib/kcl/src/test_server.rs @@ -6,7 +6,7 @@ use crate::{ errors::ExecErrorWithState, execution::{new_zoo_client, ArtifactCommand, ExecutorContext, ExecutorSettings, Operation, ProgramMemory}, settings::types::UnitLength, - ConnectionError, ExecError, KclErrorWithOutputs, Program, + ConnectionError, ExecError, ExecState, KclErrorWithOutputs, Program, }; #[derive(serde::Deserialize, serde::Serialize)] @@ -72,7 +72,7 @@ async fn do_execute_and_snapshot( ctx: &ExecutorContext, program: Program, ) -> Result<(crate::execution::ExecState, image::DynamicImage), ExecErrorWithState> { - let mut exec_state = Default::default(); + let mut exec_state = ExecState::new(&ctx.settings); let snapshot_png_bytes = ctx .execute_and_prepare_snapshot(&program, &mut exec_state) .await diff --git a/src/wasm-lib/src/wasm.rs b/src/wasm-lib/src/wasm.rs index 1ba100ebc..de65f778b 100644 --- a/src/wasm-lib/src/wasm.rs +++ b/src/wasm-lib/src/wasm.rs @@ -80,7 +80,7 @@ pub async fn execute( kcl_lib::ExecutorContext::new(engine_manager, fs_manager, settings.into()).await? }; - let mut exec_state = ExecState::default(); + let mut exec_state = ExecState::new(&ctx.settings); let mut old_ast_memory = None; // Populate from the old exec state if it exists. diff --git a/src/wasm-lib/tests/executor/cache.rs b/src/wasm-lib/tests/executor/cache.rs index 4247e8398..6677d18e4 100644 --- a/src/wasm-lib/tests/executor/cache.rs +++ b/src/wasm-lib/tests/executor/cache.rs @@ -18,7 +18,7 @@ async fn cache_test( .ok_or_else(|| anyhow::anyhow!("No variations provided for test '{}'", test_name))?; let mut ctx = kcl_lib::ExecutorContext::new_with_client(first.settings.clone(), None, None).await?; - let mut exec_state = kcl_lib::ExecState::default(); + let mut exec_state = kcl_lib::ExecState::new(&ctx.settings); let mut old_ast_state = None; let mut img_results = Vec::new(); diff --git a/src/wasm-lib/tests/modify/main.rs b/src/wasm-lib/tests/modify/main.rs index 34ce97431..10392cf10 100644 --- a/src/wasm-lib/tests/modify/main.rs +++ b/src/wasm-lib/tests/modify/main.rs @@ -10,7 +10,7 @@ use pretty_assertions::assert_eq; async fn setup(code: &str, name: &str) -> Result<(ExecutorContext, Program, ModuleId, uuid::Uuid)> { let program = Program::parse_no_errs(code)?; let ctx = kcl_lib::ExecutorContext::new_with_default_client(Default::default()).await?; - let mut exec_state = ExecState::default(); + let mut exec_state = ExecState::new(&ctx.settings); ctx.run(program.clone().into(), &mut exec_state).await?; // We need to get the sketch ID.