1pub 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
691const DEFAULT_TOLERANCE_MM: f64 = 0.0000001;
693
694#[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}