Skip to main content

microcad_builtin/
lib.rs

1// Copyright © 2024-2026 The µcad authors <info@microcad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! µcad builtin library.
5//!
6//! The built-in library is provides as µcad module `__builtin` and inserted into a resolve context.
7
8pub mod dirs;
9pub mod geo2d;
10pub mod geo3d;
11pub mod lab;
12pub mod ops;
13
14mod array;
15mod color;
16mod debug;
17mod import;
18mod log;
19mod math;
20mod string;
21
22use microcad_builtin_proc_macros::builtin_mod;
23pub use microcad_lang::builtin::{
24    Exporter, ExporterAccess, ExporterRegistry, Importer, ImporterRegistry, ModuleBuilder, Symbol,
25};
26
27/// µcad standard built-in module.
28#[builtin_mod]
29pub mod __builtin {
30    pub use crate::array::array;
31    pub use crate::color::color;
32    pub use crate::debug::debug;
33    pub use crate::geo2d::geo2d;
34    pub use crate::geo3d::geo3d;
35    pub use crate::import::import;
36    pub use crate::lab::lab;
37    pub use crate::log::log;
38    pub use crate::math::math;
39    pub use crate::ops::ops;
40    pub use crate::string::string;
41
42    use microcad_lang::{eval::EvalResult, symbol::Symbol, ty::Ty, value::Value};
43
44    /// Return type of argument.
45    pub fn type_of() -> Symbol {
46        Symbol::new_builtin_fn(
47            "type_of",
48            [].into_iter(),
49            &|_, args, _| {
50                Ok(if let Ok((_, arg)) = args.get_single() {
51                    arg.value.ty().to_string().into()
52                } else {
53                    Value::None
54                })
55            },
56            None,
57        )
58    }
59
60    /// Convert a value into a string.
61    pub fn to_string() -> Symbol {
62        Symbol::new_builtin_fn(
63            "to_string",
64            [].into_iter(),
65            &|_, args, _| {
66                Ok(if let Ok((_, arg)) = args.get_single() {
67                    arg.value.to_string().into()
68                } else {
69                    Value::None
70                })
71            },
72            None,
73        )
74    }
75
76    /// Built-in print function.
77    pub fn print() -> Symbol {
78        Symbol::new_builtin_fn(
79            "print",
80            [microcad_lang::parameter!(x)].into_iter(),
81            &|_params, args, context| {
82                args.iter().try_for_each(|(_, arg)| -> EvalResult<()> {
83                    context.print(format!("{value}", value = arg.value));
84                    Ok(())
85                })?;
86                Ok(Value::None)
87            },
88            None,
89        )
90    }
91}
92
93pub use __builtin as builtin_module;
94
95/// Get built-in importers.
96pub fn builtin_importers() -> ImporterRegistry {
97    ImporterRegistry::default().insert(microcad_import::toml::TomlImporter)
98}
99
100/// Get built-in exporters.
101pub fn builtin_exporters() -> ExporterRegistry {
102    use microcad_export::*;
103    ExporterRegistry::new()
104        .insert(svg::SvgExporter)
105        .insert(stl::StlExporter)
106        .insert(json::JsonExporter)
107        .insert(wkt::WktExporter)
108}