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