Skip to main content

kcl_lib/std/
mod.rs

1//! Functions implemented for language execution.
2
3pub mod appearance;
4pub mod args;
5pub mod array;
6pub mod assert;
7pub mod axis_or_reference;
8pub mod chamfer;
9pub mod clone;
10pub mod constraints;
11pub mod csg;
12pub mod edge;
13pub mod extrude;
14pub mod faces;
15pub mod fillet;
16pub mod gdt;
17pub mod helix;
18pub mod loft;
19pub mod math;
20pub mod mirror;
21pub mod patterns;
22pub mod planes;
23pub mod revolve;
24pub mod runtime;
25pub mod segment;
26pub mod shapes;
27pub mod shell;
28pub mod sketch;
29pub(crate) mod sketch2;
30pub mod surfaces;
31pub mod sweep;
32pub mod transform;
33pub mod utils;
34
35use anyhow::Result;
36pub use args::Args;
37use futures::future::FutureExt;
38
39use crate::{
40    errors::KclError,
41    execution::{ExecState, KclValue, KclValueControlFlow, types::PrimitiveType},
42};
43
44pub type StdFn =
45    fn(
46        &mut ExecState,
47        Args,
48    ) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<KclValueControlFlow, KclError>> + Send + '_>>;
49
50#[derive(Clone, Debug, PartialEq, Eq)]
51pub struct StdFnProps {
52    pub name: String,
53}
54
55impl StdFnProps {
56    fn default(name: &str) -> Self {
57        Self { name: name.to_owned() }
58    }
59}
60
61pub(crate) fn std_fn(path: &str, fn_name: &str) -> (crate::std::StdFn, StdFnProps) {
62    match (path, fn_name) {
63        ("gdt", "datum") => (
64            |e, a| Box::pin(crate::std::gdt::datum(e, a).map(|r| r.map(KclValue::continue_))),
65            StdFnProps::default("std::gdt::datum"),
66        ),
67        ("gdt", "flatness") => (
68            |e, a| Box::pin(crate::std::gdt::flatness(e, a).map(|r| r.map(KclValue::continue_))),
69            StdFnProps::default("std::gdt::flatness"),
70        ),
71        ("math", "cos") => (
72            |e, a| Box::pin(crate::std::math::cos(e, a).map(|r| r.map(KclValue::continue_))),
73            StdFnProps::default("std::math::cos"),
74        ),
75        ("math", "sin") => (
76            |e, a| Box::pin(crate::std::math::sin(e, a).map(|r| r.map(KclValue::continue_))),
77            StdFnProps::default("std::math::sin"),
78        ),
79        ("math", "tan") => (
80            |e, a| Box::pin(crate::std::math::tan(e, a).map(|r| r.map(KclValue::continue_))),
81            StdFnProps::default("std::math::tan"),
82        ),
83        ("math", "acos") => (
84            |e, a| Box::pin(crate::std::math::acos(e, a).map(|r| r.map(KclValue::continue_))),
85            StdFnProps::default("std::math::acos"),
86        ),
87        ("math", "asin") => (
88            |e, a| Box::pin(crate::std::math::asin(e, a).map(|r| r.map(KclValue::continue_))),
89            StdFnProps::default("std::math::asin"),
90        ),
91        ("math", "atan") => (
92            |e, a| Box::pin(crate::std::math::atan(e, a).map(|r| r.map(KclValue::continue_))),
93            StdFnProps::default("std::math::atan"),
94        ),
95        ("math", "atan2") => (
96            |e, a| Box::pin(crate::std::math::atan2(e, a).map(|r| r.map(KclValue::continue_))),
97            StdFnProps::default("std::math::atan2"),
98        ),
99        ("math", "sqrt") => (
100            |e, a| Box::pin(crate::std::math::sqrt(e, a).map(|r| r.map(KclValue::continue_))),
101            StdFnProps::default("std::math::sqrt"),
102        ),
103
104        ("math", "abs") => (
105            |e, a| Box::pin(crate::std::math::abs(e, a).map(|r| r.map(KclValue::continue_))),
106            StdFnProps::default("std::math::abs"),
107        ),
108        ("math", "rem") => (
109            |e, a| Box::pin(crate::std::math::rem(e, a).map(|r| r.map(KclValue::continue_))),
110            StdFnProps::default("std::math::rem"),
111        ),
112        ("math", "round") => (
113            |e, a| Box::pin(crate::std::math::round(e, a).map(|r| r.map(KclValue::continue_))),
114            StdFnProps::default("std::math::round"),
115        ),
116        ("math", "floor") => (
117            |e, a| Box::pin(crate::std::math::floor(e, a).map(|r| r.map(KclValue::continue_))),
118            StdFnProps::default("std::math::floor"),
119        ),
120        ("math", "ceil") => (
121            |e, a| Box::pin(crate::std::math::ceil(e, a).map(|r| r.map(KclValue::continue_))),
122            StdFnProps::default("std::math::ceil"),
123        ),
124        ("math", "min") => (
125            |e, a| Box::pin(crate::std::math::min(e, a).map(|r| r.map(KclValue::continue_))),
126            StdFnProps::default("std::math::min"),
127        ),
128        ("math", "max") => (
129            |e, a| Box::pin(crate::std::math::max(e, a).map(|r| r.map(KclValue::continue_))),
130            StdFnProps::default("std::math::max"),
131        ),
132        ("math", "pow") => (
133            |e, a| Box::pin(crate::std::math::pow(e, a).map(|r| r.map(KclValue::continue_))),
134            StdFnProps::default("std::math::pow"),
135        ),
136        ("math", "log") => (
137            |e, a| Box::pin(crate::std::math::log(e, a).map(|r| r.map(KclValue::continue_))),
138            StdFnProps::default("std::math::log"),
139        ),
140        ("math", "log2") => (
141            |e, a| Box::pin(crate::std::math::log2(e, a).map(|r| r.map(KclValue::continue_))),
142            StdFnProps::default("std::math::log2"),
143        ),
144        ("math", "log10") => (
145            |e, a| Box::pin(crate::std::math::log10(e, a).map(|r| r.map(KclValue::continue_))),
146            StdFnProps::default("std::math::log10"),
147        ),
148        ("math", "ln") => (
149            |e, a| Box::pin(crate::std::math::ln(e, a).map(|r| r.map(KclValue::continue_))),
150            StdFnProps::default("std::math::ln"),
151        ),
152        ("math", "legLen") => (
153            |e, a| Box::pin(crate::std::math::leg_length(e, a).map(|r| r.map(KclValue::continue_))),
154            StdFnProps::default("std::math::legLen"),
155        ),
156        ("math", "legAngX") => (
157            |e, a| Box::pin(crate::std::math::leg_angle_x(e, a).map(|r| r.map(KclValue::continue_))),
158            StdFnProps::default("std::math::legAngX"),
159        ),
160        ("math", "legAngY") => (
161            |e, a| Box::pin(crate::std::math::leg_angle_y(e, a).map(|r| r.map(KclValue::continue_))),
162            StdFnProps::default("std::math::legAngY"),
163        ),
164        ("sketch", "circle") => (
165            |e, a| Box::pin(crate::std::shapes::circle(e, a).map(|r| r.map(KclValue::continue_))),
166            StdFnProps::default("std::sketch::circle"),
167        ),
168        ("sketch", "ellipse") => (
169            |e, a| Box::pin(crate::std::shapes::ellipse(e, a).map(|r| r.map(KclValue::continue_))),
170            StdFnProps::default("std::sketch::ellipse"),
171        ),
172        ("prelude", "helix") => (
173            |e, a| Box::pin(crate::std::helix::helix(e, a).map(|r| r.map(KclValue::continue_))),
174            StdFnProps::default("std::helix"),
175        ),
176        ("transform", "mirror2d") => (
177            |e, a| Box::pin(crate::std::mirror::mirror_2d(e, a).map(|r| r.map(KclValue::continue_))),
178            StdFnProps::default("std::transform::mirror2d"),
179        ),
180        ("transform", "translate") => (
181            |e, a| Box::pin(crate::std::transform::translate(e, a).map(|r| r.map(KclValue::continue_))),
182            StdFnProps::default("std::transform::translate"),
183        ),
184        ("transform", "rotate") => (
185            |e, a| Box::pin(crate::std::transform::rotate(e, a).map(|r| r.map(KclValue::continue_))),
186            StdFnProps::default("std::transform::rotate"),
187        ),
188        ("transform", "scale") => (
189            |e, a| Box::pin(crate::std::transform::scale(e, a).map(|r| r.map(KclValue::continue_))),
190            StdFnProps::default("std::transform::scale"),
191        ),
192        ("prelude", "offsetPlane") => (
193            |e, a| Box::pin(crate::std::planes::offset_plane(e, a).map(|r| r.map(KclValue::continue_))),
194            StdFnProps::default("std::offsetPlane"),
195        ),
196        ("prelude", "assert") => (
197            |e, a| Box::pin(crate::std::assert::assert(e, a).map(|r| r.map(KclValue::continue_))),
198            StdFnProps::default("std::assert"),
199        ),
200        ("prelude", "assertIs") => (
201            |e, a| Box::pin(crate::std::assert::assert_is(e, a).map(|r| r.map(KclValue::continue_))),
202            StdFnProps::default("std::assertIs"),
203        ),
204        ("runtime", "exit") => (
205            |e, a| Box::pin(crate::std::runtime::exit(e, a)),
206            StdFnProps::default("std::runtime::exit"),
207        ),
208        ("solid", "fillet") => (
209            |e, a| Box::pin(crate::std::fillet::fillet(e, a).map(|r| r.map(KclValue::continue_))),
210            StdFnProps::default("std::solid::fillet"),
211        ),
212        ("solid", "chamfer") => (
213            |e, a| Box::pin(crate::std::chamfer::chamfer(e, a).map(|r| r.map(KclValue::continue_))),
214            StdFnProps::default("std::solid::chamfer"),
215        ),
216        ("solid", "shell") => (
217            |e, a| Box::pin(crate::std::shell::shell(e, a).map(|r| r.map(KclValue::continue_))),
218            StdFnProps::default("std::solid::shell"),
219        ),
220        ("solid", "hollow") => (
221            |e, a| Box::pin(crate::std::shell::hollow(e, a).map(|r| r.map(KclValue::continue_))),
222            StdFnProps::default("std::solid::hollow"),
223        ),
224        ("solid", "union") => (
225            |e, a| Box::pin(crate::std::csg::union(e, a).map(|r| r.map(KclValue::continue_))),
226            StdFnProps::default("std::solid::union"),
227        ),
228        ("solid", "intersect") => (
229            |e, a| Box::pin(crate::std::csg::intersect(e, a).map(|r| r.map(KclValue::continue_))),
230            StdFnProps::default("std::solid::intersect"),
231        ),
232        ("solid", "subtract") => (
233            |e, a| Box::pin(crate::std::csg::subtract(e, a).map(|r| r.map(KclValue::continue_))),
234            StdFnProps::default("std::solid::subtract"),
235        ),
236        ("solid", "patternTransform") => (
237            |e, a| Box::pin(crate::std::patterns::pattern_transform(e, a).map(|r| r.map(KclValue::continue_))),
238            StdFnProps::default("std::solid::patternTransform"),
239        ),
240        ("solid", "patternLinear3d") => (
241            |e, a| Box::pin(crate::std::patterns::pattern_linear_3d(e, a).map(|r| r.map(KclValue::continue_))),
242            StdFnProps::default("std::solid::patternLinear3d"),
243        ),
244        ("solid", "patternCircular3d") => (
245            |e, a| Box::pin(crate::std::patterns::pattern_circular_3d(e, a).map(|r| r.map(KclValue::continue_))),
246            StdFnProps::default("std::solid::patternCircular3d"),
247        ),
248        ("solid", "appearance") => (
249            |e, a| Box::pin(crate::std::appearance::appearance(e, a).map(|r| r.map(KclValue::continue_))),
250            StdFnProps::default("std::solid::appearance"),
251        ),
252        ("solid", "flipSurface") => (
253            |e, a| Box::pin(crate::std::surfaces::flip_surface(e, a).map(|r| r.map(KclValue::continue_))),
254            StdFnProps::default("std::solid::flipSurface"),
255        ),
256        ("solid", "split") => (
257            |e, a| Box::pin(crate::std::csg::split(e, a).map(|r| r.map(KclValue::continue_))),
258            StdFnProps::default("std::solid::split"),
259        ),
260        ("array", "map") => (
261            |e, a| Box::pin(crate::std::array::map(e, a).map(|r| r.map(KclValue::continue_))),
262            StdFnProps::default("std::array::map"),
263        ),
264        ("array", "reduce") => (
265            |e, a| Box::pin(crate::std::array::reduce(e, a).map(|r| r.map(KclValue::continue_))),
266            StdFnProps::default("std::array::reduce"),
267        ),
268        ("array", "push") => (
269            |e, a| Box::pin(crate::std::array::push(e, a).map(|r| r.map(KclValue::continue_))),
270            StdFnProps::default("std::array::push"),
271        ),
272        ("array", "pop") => (
273            |e, a| Box::pin(crate::std::array::pop(e, a).map(|r| r.map(KclValue::continue_))),
274            StdFnProps::default("std::array::pop"),
275        ),
276        ("array", "concat") => (
277            |e, a| Box::pin(crate::std::array::concat(e, a).map(|r| r.map(KclValue::continue_))),
278            StdFnProps::default("std::array::concat"),
279        ),
280        ("prelude", "clone") => (
281            |e, a| Box::pin(crate::std::clone::clone(e, a).map(|r| r.map(KclValue::continue_))),
282            StdFnProps::default("std::clone"),
283        ),
284        ("sketch", "conic") => (
285            |e, a| Box::pin(crate::std::sketch::conic(e, a).map(|r| r.map(KclValue::continue_))),
286            StdFnProps::default("std::sketch::conic"),
287        ),
288        ("sketch", "parabolic") => (
289            |e, a| Box::pin(crate::std::sketch::parabolic(e, a).map(|r| r.map(KclValue::continue_))),
290            StdFnProps::default("std::sketch::parabolic"),
291        ),
292        ("sketch", "parabolicPoint") => (
293            |e, a| Box::pin(crate::std::sketch::parabolic_point(e, a).map(|r| r.map(KclValue::continue_))),
294            StdFnProps::default("std::sketch::parabolicPoint"),
295        ),
296        ("sketch", "hyperbolic") => (
297            |e, a| Box::pin(crate::std::sketch::hyperbolic(e, a).map(|r| r.map(KclValue::continue_))),
298            StdFnProps::default("std::sketch::hyperbolic"),
299        ),
300        ("sketch", "hyperbolicPoint") => (
301            |e, a| Box::pin(crate::std::sketch::hyperbolic_point(e, a).map(|r| r.map(KclValue::continue_))),
302            StdFnProps::default("std::sketch::hyperbolicPoint"),
303        ),
304        ("sketch", "elliptic") => (
305            |e, a| Box::pin(crate::std::sketch::elliptic(e, a).map(|r| r.map(KclValue::continue_))),
306            StdFnProps::default("std::sketch::elliptic"),
307        ),
308        ("sketch", "ellipticPoint") => (
309            |e, a| Box::pin(crate::std::sketch::elliptic_point(e, a).map(|r| r.map(KclValue::continue_))),
310            StdFnProps::default("std::sketch::ellipticPoint"),
311        ),
312        ("sketch", "rectangle") => (
313            |e, a| Box::pin(crate::std::shapes::rectangle(e, a).map(|r| r.map(KclValue::continue_))),
314            StdFnProps::default("std::sketch::rectangle"),
315        ),
316        ("sketch", "planeOf") => (
317            |e, a| Box::pin(crate::std::planes::plane_of(e, a).map(|r| r.map(KclValue::continue_))),
318            StdFnProps::default("std::sketch::planeOf"),
319        ),
320        ("sketch", "faceOf") => (
321            |e, a| Box::pin(crate::std::faces::face_of(e, a).map(|r| r.map(KclValue::continue_))),
322            StdFnProps::default("std::sketch::faceOf"),
323        ),
324        ("sketch", "extrude") => (
325            |e, a| Box::pin(crate::std::extrude::extrude(e, a).map(|r| r.map(KclValue::continue_))),
326            StdFnProps::default("std::sketch::extrude"),
327        ),
328        ("sketch", "patternTransform2d") => (
329            |e, a| Box::pin(crate::std::patterns::pattern_transform_2d(e, a).map(|r| r.map(KclValue::continue_))),
330            StdFnProps::default("std::sketch::patternTransform2d"),
331        ),
332        ("sketch", "revolve") => (
333            |e, a| Box::pin(crate::std::revolve::revolve(e, a).map(|r| r.map(KclValue::continue_))),
334            StdFnProps::default("std::sketch::revolve"),
335        ),
336        ("sketch", "sweep") => (
337            |e, a| Box::pin(crate::std::sweep::sweep(e, a).map(|r| r.map(KclValue::continue_))),
338            StdFnProps::default("std::sketch::sweep"),
339        ),
340        ("sketch", "loft") => (
341            |e, a| Box::pin(crate::std::loft::loft(e, a).map(|r| r.map(KclValue::continue_))),
342            StdFnProps::default("std::sketch::loft"),
343        ),
344        ("sketch", "polygon") => (
345            |e, a| Box::pin(crate::std::shapes::polygon(e, a).map(|r| r.map(KclValue::continue_))),
346            StdFnProps::default("std::sketch::polygon"),
347        ),
348        ("sketch", "circleThreePoint") => (
349            |e, a| Box::pin(crate::std::shapes::circle_three_point(e, a).map(|r| r.map(KclValue::continue_))),
350            StdFnProps::default("std::sketch::circleThreePoint"),
351        ),
352        ("sketch", "getCommonEdge") => (
353            |e, a| Box::pin(crate::std::edge::get_common_edge(e, a).map(|r| r.map(KclValue::continue_))),
354            StdFnProps::default("std::sketch::getCommonEdge"),
355        ),
356        ("sketch", "getNextAdjacentEdge") => (
357            |e, a| Box::pin(crate::std::edge::get_next_adjacent_edge(e, a).map(|r| r.map(KclValue::continue_))),
358            StdFnProps::default("std::sketch::getNextAdjacentEdge"),
359        ),
360        ("sketch", "getOppositeEdge") => (
361            |e, a| Box::pin(crate::std::edge::get_opposite_edge(e, a).map(|r| r.map(KclValue::continue_))),
362            StdFnProps::default("std::sketch::getOppositeEdge"),
363        ),
364        ("sketch", "getPreviousAdjacentEdge") => (
365            |e, a| Box::pin(crate::std::edge::get_previous_adjacent_edge(e, a).map(|r| r.map(KclValue::continue_))),
366            StdFnProps::default("std::sketch::getPreviousAdjacentEdge"),
367        ),
368        ("sketch", "patternLinear2d") => (
369            |e, a| Box::pin(crate::std::patterns::pattern_linear_2d(e, a).map(|r| r.map(KclValue::continue_))),
370            StdFnProps::default("std::sketch::patternLinear2d"),
371        ),
372        ("sketch", "patternCircular2d") => (
373            |e, a| Box::pin(crate::std::patterns::pattern_circular_2d(e, a).map(|r| r.map(KclValue::continue_))),
374            StdFnProps::default("std::sketch::patternCircular2d"),
375        ),
376        ("sketch", "segEnd") => (
377            |e, a| Box::pin(crate::std::segment::segment_end(e, a).map(|r| r.map(KclValue::continue_))),
378            StdFnProps::default("std::sketch::segEnd"),
379        ),
380        ("sketch", "segEndX") => (
381            |e, a| Box::pin(crate::std::segment::segment_end_x(e, a).map(|r| r.map(KclValue::continue_))),
382            StdFnProps::default("std::sketch::segEndX"),
383        ),
384        ("sketch", "segEndY") => (
385            |e, a| Box::pin(crate::std::segment::segment_end_y(e, a).map(|r| r.map(KclValue::continue_))),
386            StdFnProps::default("std::sketch::segEndY"),
387        ),
388        ("sketch", "segStart") => (
389            |e, a| Box::pin(crate::std::segment::segment_start(e, a).map(|r| r.map(KclValue::continue_))),
390            StdFnProps::default("std::sketch::segStart"),
391        ),
392        ("sketch", "segStartX") => (
393            |e, a| Box::pin(crate::std::segment::segment_start_x(e, a).map(|r| r.map(KclValue::continue_))),
394            StdFnProps::default("std::sketch::segStartX"),
395        ),
396        ("sketch", "segStartY") => (
397            |e, a| Box::pin(crate::std::segment::segment_start_y(e, a).map(|r| r.map(KclValue::continue_))),
398            StdFnProps::default("std::sketch::segStartY"),
399        ),
400        ("sketch", "lastSegX") => (
401            |e, a| Box::pin(crate::std::segment::last_segment_x(e, a).map(|r| r.map(KclValue::continue_))),
402            StdFnProps::default("std::sketch::lastSegX"),
403        ),
404        ("sketch", "lastSegY") => (
405            |e, a| Box::pin(crate::std::segment::last_segment_y(e, a).map(|r| r.map(KclValue::continue_))),
406            StdFnProps::default("std::sketch::lastSegY"),
407        ),
408        ("sketch", "segLen") => (
409            |e, a| Box::pin(crate::std::segment::segment_length(e, a).map(|r| r.map(KclValue::continue_))),
410            StdFnProps::default("std::sketch::segLen"),
411        ),
412        ("sketch", "segAng") => (
413            |e, a| Box::pin(crate::std::segment::segment_angle(e, a).map(|r| r.map(KclValue::continue_))),
414            StdFnProps::default("std::sketch::segAng"),
415        ),
416        ("sketch", "tangentToEnd") => (
417            |e, a| Box::pin(crate::std::segment::tangent_to_end(e, a).map(|r| r.map(KclValue::continue_))),
418            StdFnProps::default("std::sketch::tangentToEnd"),
419        ),
420        ("sketch", "profileStart") => (
421            |e, a| Box::pin(crate::std::sketch::profile_start(e, a).map(|r| r.map(KclValue::continue_))),
422            StdFnProps::default("std::sketch::profileStart"),
423        ),
424        ("sketch", "profileStartX") => (
425            |e, a| Box::pin(crate::std::sketch::profile_start_x(e, a).map(|r| r.map(KclValue::continue_))),
426            StdFnProps::default("std::sketch::profileStartX"),
427        ),
428        ("sketch", "profileStartY") => (
429            |e, a| Box::pin(crate::std::sketch::profile_start_y(e, a).map(|r| r.map(KclValue::continue_))),
430            StdFnProps::default("std::sketch::profileStartY"),
431        ),
432        ("sketch", "startSketchOn") => (
433            |e, a| Box::pin(crate::std::sketch::start_sketch_on(e, a).map(|r| r.map(KclValue::continue_))),
434            StdFnProps::default("std::sketch::startSketchOn"),
435        ),
436        ("sketch", "startProfile") => (
437            |e, a| Box::pin(crate::std::sketch::start_profile(e, a).map(|r| r.map(KclValue::continue_))),
438            StdFnProps::default("std::sketch::startProfile"),
439        ),
440        ("sketch", "involuteCircular") => (
441            |e, a| Box::pin(crate::std::sketch::involute_circular(e, a).map(|r| r.map(KclValue::continue_))),
442            StdFnProps::default("std::sketch::involuteCircular"),
443        ),
444        ("sketch", "line") => (
445            |e, a| Box::pin(crate::std::sketch::line(e, a).map(|r| r.map(KclValue::continue_))),
446            StdFnProps::default("std::sketch::line"),
447        ),
448        ("sketch", "xLine") => (
449            |e, a| Box::pin(crate::std::sketch::x_line(e, a).map(|r| r.map(KclValue::continue_))),
450            StdFnProps::default("std::sketch::xLine"),
451        ),
452        ("sketch", "yLine") => (
453            |e, a| Box::pin(crate::std::sketch::y_line(e, a).map(|r| r.map(KclValue::continue_))),
454            StdFnProps::default("std::sketch::yLine"),
455        ),
456        ("sketch", "angledLine") => (
457            |e, a| Box::pin(crate::std::sketch::angled_line(e, a).map(|r| r.map(KclValue::continue_))),
458            StdFnProps::default("std::sketch::angledLine"),
459        ),
460        ("sketch", "angledLineThatIntersects") => (
461            |e, a| Box::pin(crate::std::sketch::angled_line_that_intersects(e, a).map(|r| r.map(KclValue::continue_))),
462            StdFnProps::default("std::sketch::angledLineThatIntersects"),
463        ),
464        ("sketch", "close") => (
465            |e, a| Box::pin(crate::std::sketch::close(e, a).map(|r| r.map(KclValue::continue_))),
466            StdFnProps::default("std::sketch::close"),
467        ),
468        ("sketch", "arc") => (
469            |e, a| Box::pin(crate::std::sketch::arc(e, a).map(|r| r.map(KclValue::continue_))),
470            StdFnProps::default("std::sketch::arc"),
471        ),
472        ("sketch", "tangentialArc") => (
473            |e, a| Box::pin(crate::std::sketch::tangential_arc(e, a).map(|r| r.map(KclValue::continue_))),
474            StdFnProps::default("std::sketch::tangentialArc"),
475        ),
476        ("sketch", "bezierCurve") => (
477            |e, a| Box::pin(crate::std::sketch::bezier_curve(e, a).map(|r| r.map(KclValue::continue_))),
478            StdFnProps::default("std::sketch::bezierCurve"),
479        ),
480        ("sketch", "subtract2d") => (
481            |e, a| Box::pin(crate::std::sketch::subtract_2d(e, a).map(|r| r.map(KclValue::continue_))),
482            StdFnProps::default("std::sketch::subtract2d"),
483        ),
484        ("appearance", "hexString") => (
485            |e, a| Box::pin(crate::std::appearance::hex_string(e, a).map(|r| r.map(KclValue::continue_))),
486            StdFnProps::default("std::appearance::hexString"),
487        ),
488        ("sketch2", "point") => (
489            |e, a| Box::pin(crate::std::constraints::point(e, a).map(|r| r.map(KclValue::continue_))),
490            StdFnProps::default("std::sketch2::point"),
491        ),
492        ("sketch2", "line") => (
493            |e, a| Box::pin(crate::std::constraints::line(e, a).map(|r| r.map(KclValue::continue_))),
494            StdFnProps::default("std::sketch2::line"),
495        ),
496        ("sketch2", "arc") => (
497            |e, a| Box::pin(crate::std::constraints::arc(e, a).map(|r| r.map(KclValue::continue_))),
498            StdFnProps::default("std::sketch2::arc"),
499        ),
500        ("sketch2", "coincident") => (
501            |e, a| Box::pin(crate::std::constraints::coincident(e, a).map(|r| r.map(KclValue::continue_))),
502            StdFnProps::default("std::sketch2::coincident"),
503        ),
504        ("sketch2", "distance") => (
505            |e, a| Box::pin(crate::std::constraints::distance(e, a).map(|r| r.map(KclValue::continue_))),
506            StdFnProps::default("std::sketch2::distance"),
507        ),
508        ("sketch2", "radius") => (
509            |e, a| Box::pin(crate::std::constraints::radius(e, a).map(|r| r.map(KclValue::continue_))),
510            StdFnProps::default("std::sketch2::radius"),
511        ),
512        ("sketch2", "diameter") => (
513            |e, a| Box::pin(crate::std::constraints::diameter(e, a).map(|r| r.map(KclValue::continue_))),
514            StdFnProps::default("std::sketch2::diameter"),
515        ),
516        ("sketch2", "horizontalDistance") => (
517            |e, a| Box::pin(crate::std::constraints::horizontal_distance(e, a).map(|r| r.map(KclValue::continue_))),
518            StdFnProps::default("std::sketch2::horizontalDistance"),
519        ),
520        ("sketch2", "verticalDistance") => (
521            |e, a| Box::pin(crate::std::constraints::vertical_distance(e, a).map(|r| r.map(KclValue::continue_))),
522            StdFnProps::default("std::sketch2::verticalDistance"),
523        ),
524        ("sketch2", "equalLength") => (
525            |e, a| Box::pin(crate::std::constraints::equal_length(e, a).map(|r| r.map(KclValue::continue_))),
526            StdFnProps::default("std::sketch2::equalLength"),
527        ),
528        ("sketch2", "horizontal") => (
529            |e, a| Box::pin(crate::std::constraints::horizontal(e, a).map(|r| r.map(KclValue::continue_))),
530            StdFnProps::default("std::sketch2::horizontal"),
531        ),
532        ("sketch2", "parallel") => (
533            |e, a| Box::pin(crate::std::constraints::parallel(e, a).map(|r| r.map(KclValue::continue_))),
534            StdFnProps::default("std::sketch2::parallel"),
535        ),
536        ("sketch2", "perpendicular") => (
537            |e, a| Box::pin(crate::std::constraints::perpendicular(e, a).map(|r| r.map(KclValue::continue_))),
538            StdFnProps::default("std::sketch2::perpendicular"),
539        ),
540        ("sketch2", "vertical") => (
541            |e, a| Box::pin(crate::std::constraints::vertical(e, a).map(|r| r.map(KclValue::continue_))),
542            StdFnProps::default("std::sketch2::vertical"),
543        ),
544        ("solid", "isSurface") => (
545            |e, a| Box::pin(crate::std::surfaces::is_surface(e, a).map(|r| r.map(KclValue::continue_))),
546            StdFnProps::default("std::solid::isSurface"),
547        ),
548        ("solid", "isSolid") => (
549            |e, a| Box::pin(crate::std::surfaces::is_solid(e, a).map(|r| r.map(KclValue::continue_))),
550            StdFnProps::default("std::solid::isSolid"),
551        ),
552        ("solid", "deleteFace") => (
553            |e, a| Box::pin(crate::std::surfaces::delete_face(e, a).map(|r| r.map(KclValue::continue_))),
554            StdFnProps::default("std::solid::deleteFace"),
555        ),
556        (module, fn_name) => {
557            panic!("No implementation found for {module}::{fn_name}, please add it to this big match statement")
558        }
559    }
560}
561
562pub(crate) fn std_ty(path: &str, fn_name: &str) -> (PrimitiveType, StdFnProps) {
563    match (path, fn_name) {
564        ("types", "Segment") => (PrimitiveType::Segment, StdFnProps::default("std::types::Segment")),
565        ("types", "Sketch") => (PrimitiveType::Sketch, StdFnProps::default("std::types::Sketch")),
566        ("types", "Solid") => (PrimitiveType::Solid, StdFnProps::default("std::types::Solid")),
567        ("types", "Plane") => (PrimitiveType::Plane, StdFnProps::default("std::types::Plane")),
568        ("types", "Face") => (PrimitiveType::Face, StdFnProps::default("std::types::Face")),
569        ("types", "GdtAnnotation") => (
570            PrimitiveType::GdtAnnotation,
571            StdFnProps::default("std::types::GdtAnnotation"),
572        ),
573        ("types", "Helix") => (PrimitiveType::Helix, StdFnProps::default("std::types::Helix")),
574        ("types", "Edge") => (PrimitiveType::Edge, StdFnProps::default("std::types::Edge")),
575        ("types", "Axis2d") => (PrimitiveType::Axis2d, StdFnProps::default("std::types::Axis2d")),
576        ("types", "Axis3d") => (PrimitiveType::Axis3d, StdFnProps::default("std::types::Axis3d")),
577        ("types", "TaggedEdge") => (PrimitiveType::TaggedEdge, StdFnProps::default("std::types::TaggedEdge")),
578        ("types", "TaggedFace") => (PrimitiveType::TaggedFace, StdFnProps::default("std::types::TaggedFace")),
579        _ => unreachable!(),
580    }
581}
582
583/// The default tolerance for modeling commands in millimeters.
584const DEFAULT_TOLERANCE_MM: f64 = 0.0000001;
585
586/// The default tolerance for testing the equality of points.
587/// WARNING: This must match the tolerance in engine/cpp/engine/scene/constants.h
588#[allow(clippy::excessive_precision)]
589const EQUAL_POINTS_DIST_EPSILON: f64 = 2.3283064365386962890625e-10;