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 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
767const DEFAULT_TOLERANCE_MM: f64 = 0.0000001;
769
770#[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}