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 BuiltinKind {
41 pub fn as_str(&self) -> &'static str {
43 match self {
44 Self::Function => "function",
45 Self::Workbench(kind) => kind.as_str(),
46 }
47 }
48}
49
50impl std::fmt::Display for BuiltinKind {
51 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
52 match self {
53 Self::Function => write!(f, "Function"),
54 Self::Workbench(kind) => write!(f, "{kind}"),
55 }
56 }
57}
58
59impl std::fmt::Debug for Builtin {
60 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
61 write!(f, "__builtin::{}", &self.id)
62 }
63}
64
65impl Builtin {
66 pub fn id(&self) -> Identifier {
68 self.id.clone()
69 }
70}
71
72impl CallTrait for Builtin {
73 fn call(&self, args: &ArgumentValueList, context: &mut EvalContext) -> EvalResult<Value> {
79 (self.f)(&self.parameters, args, context)
80 }
81}