microcad_lang/builtin/
builtin.rs1use crate::{builtin::*, eval::*, syntax::*, value::*};
7
8pub type BuiltinFn =
10 dyn Fn(&ParameterValueList, &ArgumentValueList, &mut EvalContext) -> EvalResult<Value>;
11
12#[derive(Clone)]
14pub struct Builtin {
15 pub id: Identifier,
17
18 pub parameters: ParameterValueList,
20
21 pub kind: BuiltinKind,
23
24 pub f: &'static BuiltinFn,
26
27 pub doc: Option<DocBlock>,
29}
30
31#[derive(Clone)]
33pub enum BuiltinKind {
34 Function,
36 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 pub fn id(&self) -> Identifier {
58 self.id.clone()
59 }
60}
61
62impl CallTrait for Builtin {
63 fn call(&self, args: &ArgumentValueList, context: &mut EvalContext) -> EvalResult<Value> {
69 (self.f)(&self.parameters, args, context)
70 }
71}