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 fail;
16pub mod fillet;
17pub mod gdt;
18pub mod helix;
19pub mod ids;
20pub mod loft;
21pub mod math;
22pub mod mirror;
23pub mod patterns;
24pub mod planes;
25pub mod revolve;
26pub mod runtime;
27pub mod segment;
28pub mod shapes;
29pub mod shell;
30pub mod sketch;
31pub(crate) mod solid_consumption;
32pub(crate) mod solver;
33pub mod string;
34pub mod surfaces;
35pub mod sweep;
36pub mod transform;
37pub mod utils;
38
39use anyhow::Result;
40pub use args::Args;
41use futures::future::FutureExt;
42
43use crate::errors::KclError;
44use crate::execution::ExecState;
45use crate::execution::KclValue;
46use crate::execution::KclValueControlFlow;
47use crate::execution::types::PrimitiveType;
48
49pub type StdFn =
50    fn(
51        &mut ExecState,
52        Args,
53    ) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<KclValueControlFlow, KclError>> + Send + '_>>;
54
55#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
56pub(crate) enum ConsumedSolidArgCheck {
57    #[default]
58    Error,
59    WarnDeprecated,
60}
61
62#[derive(Clone, Debug, PartialEq, Eq)]
63pub struct StdFnProps {
64    pub name: String,
65    pub(crate) consumed_solid_arg_check: ConsumedSolidArgCheck,
66}
67
68impl StdFnProps {
69    pub(crate) fn default(name: &str) -> Self {
70        Self {
71            name: name.to_owned(),
72            consumed_solid_arg_check: Default::default(),
73        }
74    }
75
76    pub(crate) fn warn_deprecated_on_consumed_solid_args(mut self) -> Self {
77        self.consumed_solid_arg_check = ConsumedSolidArgCheck::WarnDeprecated;
78        self
79    }
80}
81
82pub(crate) fn std_fn(path: &str, fn_name: &str) -> (crate::std::StdFn, StdFnProps) {
83    match (path, fn_name) {
84        ("gdt", "datum") => (
85            |e, a| Box::pin(crate::std::gdt::datum(e, a).map(|r| r.map(KclValue::continue_))),
86            StdFnProps::default("std::gdt::datum"),
87        ),
88        ("gdt", "flatness") => (
89            |e, a| Box::pin(crate::std::gdt::flatness(e, a).map(|r| r.map(KclValue::continue_))),
90            StdFnProps::default("std::gdt::flatness"),
91        ),
92        ("gdt", "straightness") => (
93            |e, a| Box::pin(crate::std::gdt::straightness(e, a).map(|r| r.map(KclValue::continue_))),
94            StdFnProps::default("std::gdt::straightness"),
95        ),
96        ("gdt", "circularity") => (
97            |e, a| Box::pin(crate::std::gdt::circularity(e, a).map(|r| r.map(KclValue::continue_))),
98            StdFnProps::default("std::gdt::circularity"),
99        ),
100        ("gdt", "cylindricity") => (
101            |e, a| Box::pin(crate::std::gdt::cylindricity(e, a).map(|r| r.map(KclValue::continue_))),
102            StdFnProps::default("std::gdt::cylindricity"),
103        ),
104        ("gdt", "concentricity") => (
105            |e, a| Box::pin(crate::std::gdt::concentricity(e, a).map(|r| r.map(KclValue::continue_))),
106            StdFnProps::default("std::gdt::concentricity"),
107        ),
108        ("gdt", "symmetry") => (
109            |e, a| Box::pin(crate::std::gdt::symmetry(e, a).map(|r| r.map(KclValue::continue_))),
110            StdFnProps::default("std::gdt::symmetry"),
111        ),
112        ("gdt", "runout") => (
113            |e, a| Box::pin(crate::std::gdt::runout(e, a).map(|r| r.map(KclValue::continue_))),
114            StdFnProps::default("std::gdt::runout"),
115        ),
116        ("gdt", "angularity") => (
117            |e, a| Box::pin(crate::std::gdt::angularity(e, a).map(|r| r.map(KclValue::continue_))),
118            StdFnProps::default("std::gdt::angularity"),
119        ),
120        ("gdt", "perpendicularity") => (
121            |e, a| Box::pin(crate::std::gdt::perpendicularity(e, a).map(|r| r.map(KclValue::continue_))),
122            StdFnProps::default("std::gdt::perpendicularity"),
123        ),
124        ("gdt", "parallelism") => (
125            |e, a| Box::pin(crate::std::gdt::parallelism(e, a).map(|r| r.map(KclValue::continue_))),
126            StdFnProps::default("std::gdt::parallelism"),
127        ),
128        ("gdt", "annotation") => (
129            |e, a| Box::pin(crate::std::gdt::annotation(e, a).map(|r| r.map(KclValue::continue_))),
130            StdFnProps::default("std::gdt::annotation"),
131        ),
132        ("gdt", "note") => (
133            |e, a| Box::pin(crate::std::gdt::note(e, a).map(|r| r.map(KclValue::continue_))),
134            StdFnProps::default("std::gdt::note"),
135        ),
136        ("gdt", "distance") => (
137            |e, a| Box::pin(crate::std::gdt::distance(e, a).map(|r| r.map(KclValue::continue_))),
138            StdFnProps::default("std::gdt::distance"),
139        ),
140        ("gdt", "profile") => (
141            |e, a| Box::pin(crate::std::gdt::profile(e, a).map(|r| r.map(KclValue::continue_))),
142            StdFnProps::default("std::gdt::profile"),
143        ),
144        ("gdt", "profileLine") => (
145            |e, a| Box::pin(crate::std::gdt::profile_line(e, a).map(|r| r.map(KclValue::continue_))),
146            StdFnProps::default("std::gdt::profileLine"),
147        ),
148        ("gdt", "profileSurface") => (
149            |e, a| Box::pin(crate::std::gdt::profile_surface(e, a).map(|r| r.map(KclValue::continue_))),
150            StdFnProps::default("std::gdt::profileSurface"),
151        ),
152        ("gdt", "position") => (
153            |e, a| Box::pin(crate::std::gdt::position(e, a).map(|r| r.map(KclValue::continue_))),
154            StdFnProps::default("std::gdt::position"),
155        ),
156        ("math", "cos") => (
157            |e, a| Box::pin(crate::std::math::cos(e, a).map(|r| r.map(KclValue::continue_))),
158            StdFnProps::default("std::math::cos"),
159        ),
160        ("math", "sin") => (
161            |e, a| Box::pin(crate::std::math::sin(e, a).map(|r| r.map(KclValue::continue_))),
162            StdFnProps::default("std::math::sin"),
163        ),
164        ("math", "tan") => (
165            |e, a| Box::pin(crate::std::math::tan(e, a).map(|r| r.map(KclValue::continue_))),
166            StdFnProps::default("std::math::tan"),
167        ),
168        ("math", "acos") => (
169            |e, a| Box::pin(crate::std::math::acos(e, a).map(|r| r.map(KclValue::continue_))),
170            StdFnProps::default("std::math::acos"),
171        ),
172        ("math", "asin") => (
173            |e, a| Box::pin(crate::std::math::asin(e, a).map(|r| r.map(KclValue::continue_))),
174            StdFnProps::default("std::math::asin"),
175        ),
176        ("math", "atan") => (
177            |e, a| Box::pin(crate::std::math::atan(e, a).map(|r| r.map(KclValue::continue_))),
178            StdFnProps::default("std::math::atan"),
179        ),
180        ("math", "atan2") => (
181            |e, a| Box::pin(crate::std::math::atan2(e, a).map(|r| r.map(KclValue::continue_))),
182            StdFnProps::default("std::math::atan2"),
183        ),
184        ("math", "sqrt") => (
185            |e, a| Box::pin(crate::std::math::sqrt(e, a).map(|r| r.map(KclValue::continue_))),
186            StdFnProps::default("std::math::sqrt"),
187        ),
188
189        ("math", "abs") => (
190            |e, a| Box::pin(crate::std::math::abs(e, a).map(|r| r.map(KclValue::continue_))),
191            StdFnProps::default("std::math::abs"),
192        ),
193        ("math", "rem") => (
194            |e, a| Box::pin(crate::std::math::rem(e, a).map(|r| r.map(KclValue::continue_))),
195            StdFnProps::default("std::math::rem"),
196        ),
197        ("math", "round") => (
198            |e, a| Box::pin(crate::std::math::round(e, a).map(|r| r.map(KclValue::continue_))),
199            StdFnProps::default("std::math::round"),
200        ),
201        ("math", "floor") => (
202            |e, a| Box::pin(crate::std::math::floor(e, a).map(|r| r.map(KclValue::continue_))),
203            StdFnProps::default("std::math::floor"),
204        ),
205        ("math", "ceil") => (
206            |e, a| Box::pin(crate::std::math::ceil(e, a).map(|r| r.map(KclValue::continue_))),
207            StdFnProps::default("std::math::ceil"),
208        ),
209        ("math", "min") => (
210            |e, a| Box::pin(crate::std::math::min(e, a).map(|r| r.map(KclValue::continue_))),
211            StdFnProps::default("std::math::min"),
212        ),
213        ("math", "max") => (
214            |e, a| Box::pin(crate::std::math::max(e, a).map(|r| r.map(KclValue::continue_))),
215            StdFnProps::default("std::math::max"),
216        ),
217        ("math", "pow") => (
218            |e, a| Box::pin(crate::std::math::pow(e, a).map(|r| r.map(KclValue::continue_))),
219            StdFnProps::default("std::math::pow"),
220        ),
221        ("math", "log") => (
222            |e, a| Box::pin(crate::std::math::log(e, a).map(|r| r.map(KclValue::continue_))),
223            StdFnProps::default("std::math::log"),
224        ),
225        ("math", "log2") => (
226            |e, a| Box::pin(crate::std::math::log2(e, a).map(|r| r.map(KclValue::continue_))),
227            StdFnProps::default("std::math::log2"),
228        ),
229        ("math", "log10") => (
230            |e, a| Box::pin(crate::std::math::log10(e, a).map(|r| r.map(KclValue::continue_))),
231            StdFnProps::default("std::math::log10"),
232        ),
233        ("math", "ln") => (
234            |e, a| Box::pin(crate::std::math::ln(e, a).map(|r| r.map(KclValue::continue_))),
235            StdFnProps::default("std::math::ln"),
236        ),
237        ("math", "legLen") => (
238            |e, a| Box::pin(crate::std::math::leg_length(e, a).map(|r| r.map(KclValue::continue_))),
239            StdFnProps::default("std::math::legLen"),
240        ),
241        ("math", "legAngX") => (
242            |e, a| Box::pin(crate::std::math::leg_angle_x(e, a).map(|r| r.map(KclValue::continue_))),
243            StdFnProps::default("std::math::legAngX"),
244        ),
245        ("math", "legAngY") => (
246            |e, a| Box::pin(crate::std::math::leg_angle_y(e, a).map(|r| r.map(KclValue::continue_))),
247            StdFnProps::default("std::math::legAngY"),
248        ),
249        ("sketch", "circle") => (
250            |e, a| Box::pin(crate::std::shapes::circle(e, a).map(|r| r.map(KclValue::continue_))),
251            StdFnProps::default("std::sketch::circle"),
252        ),
253        ("sketch", "ellipse") => (
254            |e, a| Box::pin(crate::std::shapes::ellipse(e, a).map(|r| r.map(KclValue::continue_))),
255            StdFnProps::default("std::sketch::ellipse"),
256        ),
257        ("prelude", "helix") => (
258            |e, a| Box::pin(crate::std::helix::helix(e, a).map(|r| r.map(KclValue::continue_))),
259            StdFnProps::default("std::helix"),
260        ),
261        ("transform", "mirror2d") => (
262            |e, a| Box::pin(crate::std::mirror::mirror_2d(e, a).map(|r| r.map(KclValue::continue_))),
263            StdFnProps::default("std::transform::mirror2d"),
264        ),
265        ("transform", "mirror3d") => (
266            |e, a| Box::pin(crate::std::mirror::mirror_3d(e, a).map(|r| r.map(KclValue::continue_))),
267            StdFnProps::default("std::transform::mirror3d"),
268        ),
269        ("transform", "translate") => (
270            |e, a| Box::pin(crate::std::transform::translate(e, a).map(|r| r.map(KclValue::continue_))),
271            StdFnProps::default("std::transform::translate"),
272        ),
273        ("transform", "rotate") => (
274            |e, a| Box::pin(crate::std::transform::rotate(e, a).map(|r| r.map(KclValue::continue_))),
275            StdFnProps::default("std::transform::rotate"),
276        ),
277        ("transform", "scale") => (
278            |e, a| Box::pin(crate::std::transform::scale(e, a).map(|r| r.map(KclValue::continue_))),
279            StdFnProps::default("std::transform::scale"),
280        ),
281        ("transform", "hide") => (
282            |e, a| Box::pin(crate::std::transform::hide(e, a).map(|r| r.map(KclValue::continue_))),
283            StdFnProps::default("std::transform::hide").warn_deprecated_on_consumed_solid_args(),
284        ),
285        ("transform", "delete") => (
286            |e, a| Box::pin(crate::std::transform::delete(e, a).map(|r| r.map(KclValue::continue_))),
287            StdFnProps::default("std::transform::delete"),
288        ),
289        ("prelude", "offsetPlane") => (
290            |e, a| Box::pin(crate::std::planes::offset_plane(e, a).map(|r| r.map(KclValue::continue_))),
291            StdFnProps::default("std::offsetPlane"),
292        ),
293        ("prelude", "assert") => (
294            |e, a| Box::pin(crate::std::assert::assert(e, a).map(|r| r.map(KclValue::continue_))),
295            StdFnProps::default("std::assert"),
296        ),
297        ("prelude", "assertIs") => (
298            |e, a| Box::pin(crate::std::assert::assert_is(e, a).map(|r| r.map(KclValue::continue_))),
299            StdFnProps::default("std::assertIs"),
300        ),
301        ("prelude", "fail") => (
302            |e, a| Box::pin(crate::std::fail::fail(e, a).map(|r| r.map(KclValue::continue_))),
303            StdFnProps::default("std::fail"),
304        ),
305        ("runtime", "exit") => (
306            |e, a| Box::pin(crate::std::runtime::exit(e, a)),
307            StdFnProps::default("std::runtime::exit"),
308        ),
309        ("string", "uppercase") => (
310            |e, a| Box::pin(crate::std::string::uppercase(e, a).map(|r| r.map(KclValue::continue_))),
311            StdFnProps::default("std::string::uppercase"),
312        ),
313        ("string", "lowercase") => (
314            |e, a| Box::pin(crate::std::string::lowercase(e, a).map(|r| r.map(KclValue::continue_))),
315            StdFnProps::default("std::string::lowercase"),
316        ),
317        ("string", "isEqual") => (
318            |e, a| Box::pin(crate::std::string::is_equal(e, a).map(|r| r.map(KclValue::continue_))),
319            StdFnProps::default("std::string::isEqual"),
320        ),
321        ("string", "trim") => (
322            |e, a| Box::pin(crate::std::string::trim(e, a).map(|r| r.map(KclValue::continue_))),
323            StdFnProps::default("std::string::trim"),
324        ),
325        ("string", "trimStart") => (
326            |e, a| Box::pin(crate::std::string::trim_start(e, a).map(|r| r.map(KclValue::continue_))),
327            StdFnProps::default("std::string::trimStart"),
328        ),
329        ("string", "trimEnd") => (
330            |e, a| Box::pin(crate::std::string::trim_end(e, a).map(|r| r.map(KclValue::continue_))),
331            StdFnProps::default("std::string::trimEnd"),
332        ),
333        ("solid", "fillet") => (
334            |e, a| Box::pin(crate::std::fillet::fillet(e, a).map(|r| r.map(KclValue::continue_))),
335            StdFnProps::default("std::solid::fillet"),
336        ),
337        ("solid", "chamfer") => (
338            |e, a| Box::pin(crate::std::chamfer::chamfer(e, a).map(|r| r.map(KclValue::continue_))),
339            StdFnProps::default("std::solid::chamfer"),
340        ),
341        ("solid", "shell") => (
342            |e, a| Box::pin(crate::std::shell::shell(e, a).map(|r| r.map(KclValue::continue_))),
343            StdFnProps::default("std::solid::shell"),
344        ),
345        ("solid", "hollow") => (
346            |e, a| Box::pin(crate::std::shell::hollow(e, a).map(|r| r.map(KclValue::continue_))),
347            StdFnProps::default("std::solid::hollow"),
348        ),
349        ("solid", "union") => (
350            |e, a| Box::pin(crate::std::csg::union(e, a).map(|r| r.map(KclValue::continue_))),
351            StdFnProps::default("std::solid::union"),
352        ),
353        ("solid", "intersect") => (
354            |e, a| Box::pin(crate::std::csg::intersect(e, a).map(|r| r.map(KclValue::continue_))),
355            StdFnProps::default("std::solid::intersect"),
356        ),
357        ("solid", "subtract") => (
358            |e, a| Box::pin(crate::std::csg::subtract(e, a).map(|r| r.map(KclValue::continue_))),
359            StdFnProps::default("std::solid::subtract"),
360        ),
361        ("solid", "patternTransform") => (
362            |e, a| Box::pin(crate::std::patterns::pattern_transform(e, a)),
363            StdFnProps::default("std::solid::patternTransform"),
364        ),
365        ("solid", "patternLinear3d") => (
366            |e, a| Box::pin(crate::std::patterns::pattern_linear_3d(e, a).map(|r| r.map(KclValue::continue_))),
367            StdFnProps::default("std::solid::patternLinear3d"),
368        ),
369        ("solid", "patternCircular3d") => (
370            |e, a| Box::pin(crate::std::patterns::pattern_circular_3d(e, a).map(|r| r.map(KclValue::continue_))),
371            StdFnProps::default("std::solid::patternCircular3d"),
372        ),
373        ("solid", "appearance") => (
374            |e, a| Box::pin(crate::std::appearance::appearance(e, a).map(|r| r.map(KclValue::continue_))),
375            StdFnProps::default("std::solid::appearance"),
376        ),
377        ("solid", "flipSurface") => (
378            |e, a| Box::pin(crate::std::surfaces::flip_surface(e, a).map(|r| r.map(KclValue::continue_))),
379            StdFnProps::default("std::solid::flipSurface"),
380        ),
381        ("solid", "split") => (
382            |e, a| Box::pin(crate::std::csg::split(e, a).map(|r| r.map(KclValue::continue_))),
383            StdFnProps::default("std::solid::split"),
384        ),
385        ("array", "map") => (
386            |e, a| Box::pin(crate::std::array::map(e, a)),
387            StdFnProps::default("std::array::map"),
388        ),
389        ("array", "reduce") => (
390            |e, a| Box::pin(crate::std::array::reduce(e, a)),
391            StdFnProps::default("std::array::reduce"),
392        ),
393        ("array", "push") => (
394            |e, a| Box::pin(crate::std::array::push(e, a).map(|r| r.map(KclValue::continue_))),
395            StdFnProps::default("std::array::push"),
396        ),
397        ("array", "pop") => (
398            |e, a| Box::pin(crate::std::array::pop(e, a).map(|r| r.map(KclValue::continue_))),
399            StdFnProps::default("std::array::pop"),
400        ),
401        ("array", "concat") => (
402            |e, a| Box::pin(crate::std::array::concat(e, a).map(|r| r.map(KclValue::continue_))),
403            StdFnProps::default("std::array::concat"),
404        ),
405        ("array", "slice") => (
406            |e, a| Box::pin(crate::std::array::slice(e, a).map(|r| r.map(KclValue::continue_))),
407            StdFnProps::default("std::array::slice"),
408        ),
409        ("array", "flatten") => (
410            |e, a| Box::pin(crate::std::array::flatten(e, a).map(|r| r.map(KclValue::continue_))),
411            StdFnProps::default("std::array::flatten").warn_deprecated_on_consumed_solid_args(),
412        ),
413        ("prelude", "clone") => (
414            |e, a| Box::pin(crate::std::clone::clone(e, a).map(|r| r.map(KclValue::continue_))),
415            StdFnProps::default("std::clone"),
416        ),
417        ("prelude", "faceId") => (
418            |e, a| Box::pin(crate::std::ids::face_id(e, a).map(|r| r.map(KclValue::continue_))),
419            StdFnProps::default("std::faceId"),
420        ),
421        ("prelude", "edgeId") => (
422            |e, a| Box::pin(crate::std::ids::edge_id(e, a).map(|r| r.map(KclValue::continue_))),
423            StdFnProps::default("std::edgeId"),
424        ),
425        ("sketch", "conic") => (
426            |e, a| Box::pin(crate::std::sketch::conic(e, a).map(|r| r.map(KclValue::continue_))),
427            StdFnProps::default("std::sketch::conic"),
428        ),
429        ("sketch", "parabolic") => (
430            |e, a| Box::pin(crate::std::sketch::parabolic(e, a).map(|r| r.map(KclValue::continue_))),
431            StdFnProps::default("std::sketch::parabolic"),
432        ),
433        ("sketch", "parabolicPoint") => (
434            |e, a| Box::pin(crate::std::sketch::parabolic_point(e, a).map(|r| r.map(KclValue::continue_))),
435            StdFnProps::default("std::sketch::parabolicPoint"),
436        ),
437        ("sketch", "hyperbolic") => (
438            |e, a| Box::pin(crate::std::sketch::hyperbolic(e, a).map(|r| r.map(KclValue::continue_))),
439            StdFnProps::default("std::sketch::hyperbolic"),
440        ),
441        ("sketch", "hyperbolicPoint") => (
442            |e, a| Box::pin(crate::std::sketch::hyperbolic_point(e, a).map(|r| r.map(KclValue::continue_))),
443            StdFnProps::default("std::sketch::hyperbolicPoint"),
444        ),
445        ("sketch", "elliptic") => (
446            |e, a| Box::pin(crate::std::sketch::elliptic(e, a).map(|r| r.map(KclValue::continue_))),
447            StdFnProps::default("std::sketch::elliptic"),
448        ),
449        ("sketch", "ellipticPoint") => (
450            |e, a| Box::pin(crate::std::sketch::elliptic_point(e, a).map(|r| r.map(KclValue::continue_))),
451            StdFnProps::default("std::sketch::ellipticPoint"),
452        ),
453        ("sketch", "rectangle") => (
454            |e, a| Box::pin(crate::std::shapes::rectangle(e, a).map(|r| r.map(KclValue::continue_))),
455            StdFnProps::default("std::sketch::rectangle"),
456        ),
457        ("sketch", "planeOf") => (
458            |e, a| Box::pin(crate::std::planes::plane_of(e, a).map(|r| r.map(KclValue::continue_))),
459            StdFnProps::default("std::sketch::planeOf"),
460        ),
461        ("sketch", "faceOf") => (
462            |e, a| Box::pin(crate::std::faces::face_of(e, a).map(|r| r.map(KclValue::continue_))),
463            StdFnProps::default("std::sketch::faceOf"),
464        ),
465        ("sketch", "extrude") => (
466            |e, a| Box::pin(crate::std::extrude::extrude(e, a).map(|r| r.map(KclValue::continue_))),
467            StdFnProps::default("std::sketch::extrude"),
468        ),
469        ("sketch", "patternTransform2d") => (
470            |e, a| Box::pin(crate::std::patterns::pattern_transform_2d(e, a)),
471            StdFnProps::default("std::sketch::patternTransform2d"),
472        ),
473        ("sketch", "revolve") => (
474            |e, a| Box::pin(crate::std::revolve::revolve(e, a).map(|r| r.map(KclValue::continue_))),
475            StdFnProps::default("std::sketch::revolve"),
476        ),
477        ("sketch", "sweep") => (
478            |e, a| Box::pin(crate::std::sweep::sweep(e, a).map(|r| r.map(KclValue::continue_))),
479            StdFnProps::default("std::sketch::sweep"),
480        ),
481        ("sketch", "loft") => (
482            |e, a| Box::pin(crate::std::loft::loft(e, a).map(|r| r.map(KclValue::continue_))),
483            StdFnProps::default("std::sketch::loft"),
484        ),
485        ("sketch", "polygon") => (
486            |e, a| Box::pin(crate::std::shapes::polygon(e, a).map(|r| r.map(KclValue::continue_))),
487            StdFnProps::default("std::sketch::polygon"),
488        ),
489        ("sketch", "circleThreePoint") => (
490            |e, a| Box::pin(crate::std::shapes::circle_three_point(e, a).map(|r| r.map(KclValue::continue_))),
491            StdFnProps::default("std::sketch::circleThreePoint"),
492        ),
493        ("sketch", "getCommonEdge") => (
494            |e, a| Box::pin(crate::std::edge::get_common_edge(e, a).map(|r| r.map(KclValue::continue_))),
495            StdFnProps::default("std::sketch::getCommonEdge"),
496        ),
497        ("sketch", "getBoundedEdge") => (
498            |e, a| Box::pin(crate::std::edge::get_bounded_edge(e, a).map(|r| r.map(KclValue::continue_))),
499            StdFnProps::default("std::sketch::getBoundedEdge"),
500        ),
501        ("sketch", "getNextAdjacentEdge") => (
502            |e, a| Box::pin(crate::std::edge::get_next_adjacent_edge(e, a).map(|r| r.map(KclValue::continue_))),
503            StdFnProps::default("std::sketch::getNextAdjacentEdge"),
504        ),
505        ("sketch", "getOppositeEdge") => (
506            |e, a| Box::pin(crate::std::edge::get_opposite_edge(e, a).map(|r| r.map(KclValue::continue_))),
507            StdFnProps::default("std::sketch::getOppositeEdge"),
508        ),
509        ("sketch", "getPreviousAdjacentEdge") => (
510            |e, a| Box::pin(crate::std::edge::get_previous_adjacent_edge(e, a).map(|r| r.map(KclValue::continue_))),
511            StdFnProps::default("std::sketch::getPreviousAdjacentEdge"),
512        ),
513        ("sketch", "patternLinear2d") => (
514            |e, a| Box::pin(crate::std::patterns::pattern_linear_2d(e, a).map(|r| r.map(KclValue::continue_))),
515            StdFnProps::default("std::sketch::patternLinear2d"),
516        ),
517        ("sketch", "patternCircular2d") => (
518            |e, a| Box::pin(crate::std::patterns::pattern_circular_2d(e, a).map(|r| r.map(KclValue::continue_))),
519            StdFnProps::default("std::sketch::patternCircular2d"),
520        ),
521        ("sketch", "segEnd") => (
522            |e, a| Box::pin(crate::std::segment::segment_end(e, a).map(|r| r.map(KclValue::continue_))),
523            StdFnProps::default("std::sketch::segEnd"),
524        ),
525        ("sketch", "segEndX") => (
526            |e, a| Box::pin(crate::std::segment::segment_end_x(e, a).map(|r| r.map(KclValue::continue_))),
527            StdFnProps::default("std::sketch::segEndX"),
528        ),
529        ("sketch", "segEndY") => (
530            |e, a| Box::pin(crate::std::segment::segment_end_y(e, a).map(|r| r.map(KclValue::continue_))),
531            StdFnProps::default("std::sketch::segEndY"),
532        ),
533        ("sketch", "segStart") => (
534            |e, a| Box::pin(crate::std::segment::segment_start(e, a).map(|r| r.map(KclValue::continue_))),
535            StdFnProps::default("std::sketch::segStart"),
536        ),
537        ("sketch", "segStartX") => (
538            |e, a| Box::pin(crate::std::segment::segment_start_x(e, a).map(|r| r.map(KclValue::continue_))),
539            StdFnProps::default("std::sketch::segStartX"),
540        ),
541        ("sketch", "segStartY") => (
542            |e, a| Box::pin(crate::std::segment::segment_start_y(e, a).map(|r| r.map(KclValue::continue_))),
543            StdFnProps::default("std::sketch::segStartY"),
544        ),
545        ("sketch", "lastSegX") => (
546            |e, a| Box::pin(crate::std::segment::last_segment_x(e, a).map(|r| r.map(KclValue::continue_))),
547            StdFnProps::default("std::sketch::lastSegX"),
548        ),
549        ("sketch", "lastSegY") => (
550            |e, a| Box::pin(crate::std::segment::last_segment_y(e, a).map(|r| r.map(KclValue::continue_))),
551            StdFnProps::default("std::sketch::lastSegY"),
552        ),
553        ("sketch", "segLen") => (
554            |e, a| Box::pin(crate::std::segment::segment_length(e, a).map(|r| r.map(KclValue::continue_))),
555            StdFnProps::default("std::sketch::segLen"),
556        ),
557        ("sketch", "segAng") => (
558            |e, a| Box::pin(crate::std::segment::segment_angle(e, a).map(|r| r.map(KclValue::continue_))),
559            StdFnProps::default("std::sketch::segAng"),
560        ),
561        ("sketch", "tangentToEnd") => (
562            |e, a| Box::pin(crate::std::segment::tangent_to_end(e, a).map(|r| r.map(KclValue::continue_))),
563            StdFnProps::default("std::sketch::tangentToEnd"),
564        ),
565        ("sketch", "profileStart") => (
566            |e, a| Box::pin(crate::std::sketch::profile_start(e, a).map(|r| r.map(KclValue::continue_))),
567            StdFnProps::default("std::sketch::profileStart"),
568        ),
569        ("sketch", "profileStartX") => (
570            |e, a| Box::pin(crate::std::sketch::profile_start_x(e, a).map(|r| r.map(KclValue::continue_))),
571            StdFnProps::default("std::sketch::profileStartX"),
572        ),
573        ("sketch", "profileStartY") => (
574            |e, a| Box::pin(crate::std::sketch::profile_start_y(e, a).map(|r| r.map(KclValue::continue_))),
575            StdFnProps::default("std::sketch::profileStartY"),
576        ),
577        ("sketch", "startSketchOn") => (
578            |e, a| Box::pin(crate::std::sketch::start_sketch_on(e, a).map(|r| r.map(KclValue::continue_))),
579            StdFnProps::default("std::sketch::startSketchOn"),
580        ),
581        ("sketch", "startProfile") => (
582            |e, a| Box::pin(crate::std::sketch::start_profile(e, a).map(|r| r.map(KclValue::continue_))),
583            StdFnProps::default("std::sketch::startProfile"),
584        ),
585        ("sketch", "involuteCircular") => (
586            |e, a| Box::pin(crate::std::sketch::involute_circular(e, a).map(|r| r.map(KclValue::continue_))),
587            StdFnProps::default("std::sketch::involuteCircular"),
588        ),
589        ("sketch", "line") => (
590            |e, a| Box::pin(crate::std::sketch::line(e, a).map(|r| r.map(KclValue::continue_))),
591            StdFnProps::default("std::sketch::line"),
592        ),
593        ("sketch", "xLine") => (
594            |e, a| Box::pin(crate::std::sketch::x_line(e, a).map(|r| r.map(KclValue::continue_))),
595            StdFnProps::default("std::sketch::xLine"),
596        ),
597        ("sketch", "yLine") => (
598            |e, a| Box::pin(crate::std::sketch::y_line(e, a).map(|r| r.map(KclValue::continue_))),
599            StdFnProps::default("std::sketch::yLine"),
600        ),
601        ("sketch", "angledLine") => (
602            |e, a| Box::pin(crate::std::sketch::angled_line(e, a).map(|r| r.map(KclValue::continue_))),
603            StdFnProps::default("std::sketch::angledLine"),
604        ),
605        ("sketch", "angledLineThatIntersects") => (
606            |e, a| Box::pin(crate::std::sketch::angled_line_that_intersects(e, a).map(|r| r.map(KclValue::continue_))),
607            StdFnProps::default("std::sketch::angledLineThatIntersects"),
608        ),
609        ("sketch", "close") => (
610            |e, a| Box::pin(crate::std::sketch::close(e, a).map(|r| r.map(KclValue::continue_))),
611            StdFnProps::default("std::sketch::close"),
612        ),
613        ("sketch", "arc") => (
614            |e, a| Box::pin(crate::std::sketch::arc(e, a).map(|r| r.map(KclValue::continue_))),
615            StdFnProps::default("std::sketch::arc"),
616        ),
617        ("sketch", "tangentialArc") => (
618            |e, a| Box::pin(crate::std::sketch::tangential_arc(e, a).map(|r| r.map(KclValue::continue_))),
619            StdFnProps::default("std::sketch::tangentialArc"),
620        ),
621        ("sketch", "bezierCurve") => (
622            |e, a| Box::pin(crate::std::sketch::bezier_curve(e, a).map(|r| r.map(KclValue::continue_))),
623            StdFnProps::default("std::sketch::bezierCurve"),
624        ),
625        ("sketch", "subtract2d") => (
626            |e, a| Box::pin(crate::std::sketch::subtract_2d(e, a).map(|r| r.map(KclValue::continue_))),
627            StdFnProps::default("std::sketch::subtract2d"),
628        ),
629        ("appearance", "hexString") => (
630            |e, a| Box::pin(crate::std::appearance::hex_string(e, a).map(|r| r.map(KclValue::continue_))),
631            StdFnProps::default("std::appearance::hexString"),
632        ),
633        ("solver", "point") => (
634            |e, a| Box::pin(crate::std::constraints::point(e, a).map(|r| r.map(KclValue::continue_))),
635            StdFnProps::default("std::solver::point"),
636        ),
637        ("solver", "line") => (
638            |e, a| Box::pin(crate::std::constraints::line(e, a).map(|r| r.map(KclValue::continue_))),
639            StdFnProps::default("std::solver::line"),
640        ),
641        ("solver", "arc") => (
642            |e, a| Box::pin(crate::std::constraints::arc(e, a).map(|r| r.map(KclValue::continue_))),
643            StdFnProps::default("std::solver::arc"),
644        ),
645        ("solver", "circle") => (
646            |e, a| Box::pin(crate::std::constraints::circle(e, a).map(|r| r.map(KclValue::continue_))),
647            StdFnProps::default("std::solver::circle"),
648        ),
649        ("solver", "controlPointSpline") => (
650            |e, a| Box::pin(crate::std::constraints::control_point_spline(e, a).map(|r| r.map(KclValue::continue_))),
651            StdFnProps::default("std::solver::controlPointSpline"),
652        ),
653        ("solver", "coincident") => (
654            |e, a| Box::pin(crate::std::constraints::coincident(e, a).map(|r| r.map(KclValue::continue_))),
655            StdFnProps::default("std::solver::coincident"),
656        ),
657        ("solver", "distance") => (
658            |e, a| Box::pin(crate::std::constraints::distance(e, a).map(|r| r.map(KclValue::continue_))),
659            StdFnProps::default("std::solver::distance"),
660        ),
661        ("solver", "radius") => (
662            |e, a| Box::pin(crate::std::constraints::radius(e, a).map(|r| r.map(KclValue::continue_))),
663            StdFnProps::default("std::solver::radius"),
664        ),
665        ("solver", "diameter") => (
666            |e, a| Box::pin(crate::std::constraints::diameter(e, a).map(|r| r.map(KclValue::continue_))),
667            StdFnProps::default("std::solver::diameter"),
668        ),
669        ("solver", "horizontalDistance") => (
670            |e, a| Box::pin(crate::std::constraints::horizontal_distance(e, a).map(|r| r.map(KclValue::continue_))),
671            StdFnProps::default("std::solver::horizontalDistance"),
672        ),
673        ("solver", "verticalDistance") => (
674            |e, a| Box::pin(crate::std::constraints::vertical_distance(e, a).map(|r| r.map(KclValue::continue_))),
675            StdFnProps::default("std::solver::verticalDistance"),
676        ),
677        ("solver", "equalLength") => (
678            |e, a| Box::pin(crate::std::constraints::equal_length(e, a).map(|r| r.map(KclValue::continue_))),
679            StdFnProps::default("std::solver::equalLength"),
680        ),
681        ("solver", "midpoint") => (
682            |e, a| Box::pin(crate::std::constraints::midpoint(e, a).map(|r| r.map(KclValue::continue_))),
683            StdFnProps::default("std::solver::midpoint"),
684        ),
685        ("solver", "equalRadius") => (
686            |e, a| Box::pin(crate::std::constraints::equal_radius(e, a).map(|r| r.map(KclValue::continue_))),
687            StdFnProps::default("std::solver::equalRadius"),
688        ),
689        ("solver", "angle") => (
690            |e, a| Box::pin(crate::std::constraints::angle(e, a).map(|r| r.map(KclValue::continue_))),
691            StdFnProps::default("std::solver::angle"),
692        ),
693        ("solver", "tangent") => (
694            |e, a| Box::pin(crate::std::constraints::tangent(e, a).map(|r| r.map(KclValue::continue_))),
695            StdFnProps::default("std::solver::tangent"),
696        ),
697        ("solver", "symmetric") => (
698            |e, a| Box::pin(crate::std::constraints::symmetric(e, a).map(|r| r.map(KclValue::continue_))),
699            StdFnProps::default("std::solver::symmetric"),
700        ),
701        ("solver", "horizontal") => (
702            |e, a| Box::pin(crate::std::constraints::horizontal(e, a).map(|r| r.map(KclValue::continue_))),
703            StdFnProps::default("std::solver::horizontal"),
704        ),
705        ("solver", "parallel") => (
706            |e, a| Box::pin(crate::std::constraints::parallel(e, a).map(|r| r.map(KclValue::continue_))),
707            StdFnProps::default("std::solver::parallel"),
708        ),
709        ("solver", "perpendicular") => (
710            |e, a| Box::pin(crate::std::constraints::perpendicular(e, a).map(|r| r.map(KclValue::continue_))),
711            StdFnProps::default("std::solver::perpendicular"),
712        ),
713        ("solver", "vertical") => (
714            |e, a| Box::pin(crate::std::constraints::vertical(e, a).map(|r| r.map(KclValue::continue_))),
715            StdFnProps::default("std::solver::vertical"),
716        ),
717        ("sketch", "region") => (
718            |e, a| Box::pin(crate::std::sketch::region(e, a).map(|r| r.map(KclValue::continue_))),
719            StdFnProps::default("std::sketch::region"),
720        ),
721        ("solid", "isSurface") => (
722            |e, a| Box::pin(crate::std::surfaces::is_surface(e, a).map(|r| r.map(KclValue::continue_))),
723            StdFnProps::default("std::solid::isSurface"),
724        ),
725        ("solid", "isSolid") => (
726            |e, a| Box::pin(crate::std::surfaces::is_solid(e, a).map(|r| r.map(KclValue::continue_))),
727            StdFnProps::default("std::solid::isSolid"),
728        ),
729        ("solid", "deleteFace") => (
730            |e, a| Box::pin(crate::std::surfaces::delete_face(e, a).map(|r| r.map(KclValue::continue_))),
731            StdFnProps::default("std::solid::deleteFace"),
732        ),
733        ("solid", "blend") => (
734            |e, a| Box::pin(crate::std::surfaces::blend(e, a).map(|r| r.map(KclValue::continue_))),
735            StdFnProps::default("std::solid::blend"),
736        ),
737        ("solid", "joinSurfaces") => (
738            |e, a| Box::pin(crate::std::surfaces::join(e, a).map(|r| r.map(KclValue::continue_))),
739            StdFnProps::default("std::solid::joinSurfaces"),
740        ),
741        (module, fn_name) => {
742            panic!("No implementation found for {module}::{fn_name}, please add it to this big match statement")
743        }
744    }
745}
746
747pub(crate) fn std_ty(path: &str, fn_name: &str) -> (PrimitiveType, StdFnProps) {
748    match (path, fn_name) {
749        ("types", "Segment") => (PrimitiveType::Segment, StdFnProps::default("std::types::Segment")),
750        ("types", "Sketch") => (PrimitiveType::Sketch, StdFnProps::default("std::types::Sketch")),
751        ("types", "Solid") => (PrimitiveType::Solid, StdFnProps::default("std::types::Solid")),
752        ("types", "Plane") => (PrimitiveType::Plane, StdFnProps::default("std::types::Plane")),
753        ("types", "Face") => (PrimitiveType::Face, StdFnProps::default("std::types::Face")),
754        ("types", "GdtAnnotation") => (
755            PrimitiveType::GdtAnnotation,
756            StdFnProps::default("std::types::GdtAnnotation"),
757        ),
758        ("types", "Helix") => (PrimitiveType::Helix, StdFnProps::default("std::types::Helix")),
759        ("types", "Edge") => (PrimitiveType::Edge, StdFnProps::default("std::types::Edge")),
760        ("types", "Axis2d") => (PrimitiveType::Axis2d, StdFnProps::default("std::types::Axis2d")),
761        ("types", "Axis3d") => (PrimitiveType::Axis3d, StdFnProps::default("std::types::Axis3d")),
762        ("types", "TaggedEdge") => (PrimitiveType::TaggedEdge, StdFnProps::default("std::types::TaggedEdge")),
763        ("types", "TaggedFace") => (PrimitiveType::TaggedFace, StdFnProps::default("std::types::TaggedFace")),
764        ("types", "BoundedEdge") => (
765            PrimitiveType::BoundedEdge,
766            StdFnProps::default("std::types::BoundedEdge"),
767        ),
768        _ => unreachable!(),
769    }
770}
771
772/// The default tolerance for modeling commands in millimeters.
773const DEFAULT_TOLERANCE_MM: f64 = 0.0000001;
774
775/// The default tolerance for testing the equality of points.
776/// WARNING: This must match the tolerance in engine/cpp/engine/scene/constants.h
777#[allow(clippy::excessive_precision)]
778const EQUAL_POINTS_DIST_EPSILON: f64 = 2.3283064365386962890625e-10;
779
780#[derive(Debug, Clone, Copy, PartialEq, Eq)]
781pub(crate) enum CircularDirection {
782    Counterclockwise,
783    Clockwise,
784}
785
786impl CircularDirection {
787    pub fn is_clockwise(self) -> bool {
788        match self {
789            CircularDirection::Counterclockwise => false,
790            CircularDirection::Clockwise => true,
791        }
792    }
793}