microcad_lang/builtin/
builtin.rs

1// Copyright © 2025 The µcad authors <info@ucad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! Builtin evaluation entity
5
6use crate::{builtin::*, eval::*, syntax::*, value::*};
7
8/// Builtin function type
9pub type BuiltinFn =
10    dyn Fn(&ParameterValueList, &ArgumentValueList, &mut EvalContext) -> EvalResult<Value>;
11
12/// Builtin function struct
13#[derive(Clone)]
14pub struct Builtin {
15    /// Name of the builtin function
16    pub id: Identifier,
17
18    /// Optional parameter value list to check the builtin signature.
19    pub parameters: ParameterValueList,
20
21    /// Built-in kind.
22    pub kind: BuiltinKind,
23
24    /// Functor to evaluate this function
25    pub f: &'static BuiltinFn,
26
27    /// Functor which returns documentation of this function
28    pub doc: Option<DocBlock>,
29}
30
31/// Kind of the built-in.
32#[derive(Clone)]
33pub enum BuiltinKind {
34    /// A built-in function: `fn ()`.
35    Function,
36    /// A built-in workpiece: operation, transform, sketch, part.
37    Workbench(BuiltinWorkbenchKind),
38}
39
40impl std::fmt::Display for BuiltinKind {
41    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
42        match self {
43            Self::Function => write!(f, "Function"),
44            Self::Workbench(kind) => write!(f, "{kind}"),
45        }
46    }
47}
48
49impl std::fmt::Debug for Builtin {
50    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
51        write!(f, "__builtin::{}", &self.id)
52    }
53}
54
55impl Builtin {
56    /// Return identifier.
57    pub fn id(&self) -> Identifier {
58        self.id.clone()
59    }
60}
61
62impl CallTrait for Builtin {
63    /// Call builtin function with given parameter.
64    ///
65    /// # Arguments
66    /// - `args`: Function arguments.
67    /// - `context`: Execution context.
68    fn call(&self, args: &ArgumentValueList, context: &mut EvalContext) -> EvalResult<Value> {
69        (self.f)(&self.parameters, args, context)
70    }
71}