diff --git a/src/wasm-lib/kcl/src/std/sketch.rs b/src/wasm-lib/kcl/src/std/sketch.rs index c2d1518e6..6ef28718d 100644 --- a/src/wasm-lib/kcl/src/std/sketch.rs +++ b/src/wasm-lib/kcl/src/std/sketch.rs @@ -995,27 +995,35 @@ async fn start_sketch_on_face( args: Args, ) -> Result, KclError> { let extrude_plane_id = match tag { - SketchOnFaceTag::String(ref s) => extrude_group - .value - .iter() - .find_map(|extrude_surface| match extrude_surface { - ExtrudeSurface::ExtrudePlane(extrude_plane) if extrude_plane.name == *s => { - Some(Ok(extrude_plane.face_id)) - } - ExtrudeSurface::ExtrudeArc(extrude_arc) if extrude_arc.name == *s => { - Some(Err(KclError::Type(KclErrorDetails { - message: format!("Cannot sketch on a non-planar surface: `{}`", tag), - source_ranges: vec![args.source_range], - }))) - } - ExtrudeSurface::ExtrudePlane(_) | ExtrudeSurface::ExtrudeArc(_) => None, - }) - .ok_or_else(|| { - KclError::Type(KclErrorDetails { - message: format!("Expected a face with the tag `{}`", tag), + SketchOnFaceTag::String(ref s) => { + if s.is_empty() { + return Err(KclError::Type(KclErrorDetails { + message: "Expected a non-empty tag for the face to sketch on".to_string(), source_ranges: vec![args.source_range], + })); + } + extrude_group + .value + .iter() + .find_map(|extrude_surface| match extrude_surface { + ExtrudeSurface::ExtrudePlane(extrude_plane) if extrude_plane.name == *s => { + Some(Ok(extrude_plane.face_id)) + } + ExtrudeSurface::ExtrudeArc(extrude_arc) if extrude_arc.name == *s => { + Some(Err(KclError::Type(KclErrorDetails { + message: format!("Cannot sketch on a non-planar surface: `{}`", tag), + source_ranges: vec![args.source_range], + }))) + } + ExtrudeSurface::ExtrudePlane(_) | ExtrudeSurface::ExtrudeArc(_) => None, }) - })??, + .ok_or_else(|| { + KclError::Type(KclErrorDetails { + message: format!("Expected a face with the tag `{}`", tag), + source_ranges: vec![args.source_range], + }) + })?? + } SketchOnFaceTag::StartOrEnd(StartOrEnd::Start) => extrude_group.start_cap_id.ok_or_else(|| { KclError::Type(KclErrorDetails { message: "Expected a start face to sketch on".to_string(), diff --git a/src/wasm-lib/tests/executor/main.rs b/src/wasm-lib/tests/executor/main.rs index 685809d0a..75f7de614 100644 --- a/src/wasm-lib/tests/executor/main.rs +++ b/src/wasm-lib/tests/executor/main.rs @@ -2057,3 +2057,27 @@ const bracket = startSketchOn('XY') r#"engine: KclErrorDetails { source_ranges: [SourceRange([1443, 1443])], message: "Modeling command failed: Some([ApiError { error_code: BadRequest, message: \"Fillet failed\" }])" }"# ); } + +#[tokio::test(flavor = "multi_thread")] +async fn serial_test_error_empty_start_sketch_on_string() { + let code = r#"const part001 = startSketchOn('-XZ') + |> startProfileAt([75.75, 184.25], %) + |> line([190.03, -118.13], %) + |> line([-33.38, -202.86], %) + |> line([-315.86, -64.2], %) + |> tangentialArcTo([-147.66, 121.34], %) + |> close(%) + |> extrude(100, %) + +const secondSketch = startSketchOn(part001, '') + |> circle([-20, 50], 40, %) + |> extrude(20, %) +"#; + + let result = execute_and_snapshot(code, kcl_lib::settings::types::UnitLength::Mm).await; + assert!(result.is_err()); + assert_eq!( + result.err().unwrap().to_string(), + r#"type: KclErrorDetails { source_ranges: [SourceRange([272, 298])], message: "Expected a non-empty tag for the face to sketch on" }"# + ); +}