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