1pub 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#[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 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 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 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
95pub fn builtin_importers() -> ImporterRegistry {
97 ImporterRegistry::default().insert(microcad_import::toml::TomlImporter)
98}
99
100pub 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}