1use axiolid_core::{Aabb, Frame2, Frame3, Transform3};
8use axiolid_curve::{Curve2, Curve3};
9use axiolid_mesh::{PolygonMesh, TriMesh};
10use axiolid_primitive::{HalfSpace, Primitive};
11use axiolid_profile::Profile;
12use axiolid_surface::Surface;
13use axiolid_topology::BRep;
14
15use crate::{
16 CurveRelation, CurveStation, GeometryNode, Instance, NodeId, OpenProfile, OrientedCurveStation,
17 PointOnCurve, PointOnSurface, SolidOperation, SurfaceRelation,
18};
19
20mod private {
21 pub trait Sealed {}
22}
23
24pub trait BuiltInNode: private::Sealed + Into<GeometryNode> {}
45
46macro_rules! built_in_node {
47 ($value:ty, $variant:ident) => {
48 impl From<$value> for GeometryNode {
49 fn from(value: $value) -> Self {
50 Self::$variant(value)
51 }
52 }
53
54 impl private::Sealed for $value {}
55 impl BuiltInNode for $value {}
56 };
57}
58
59built_in_node!(Frame2, Frame2);
60built_in_node!(Frame3, Frame3);
61built_in_node!(Transform3, Transform);
62built_in_node!(Curve2, Curve2);
63built_in_node!(Curve3, Curve3);
64built_in_node!(CurveRelation, CurveRelation);
65built_in_node!(PointOnCurve, PointOnCurve);
66built_in_node!(Surface, Surface);
67built_in_node!(SurfaceRelation, SurfaceRelation);
68built_in_node!(PointOnSurface, PointOnSurface);
69built_in_node!(Profile, Profile);
70built_in_node!(OpenProfile, OpenProfile);
71built_in_node!(Primitive, Primitive);
72built_in_node!(HalfSpace, HalfSpace);
73built_in_node!(SolidOperation, SolidOperation);
74built_in_node!(BRep<NodeId>, BRep);
75built_in_node!(PolygonMesh, PolygonMesh);
76built_in_node!(TriMesh, TriMesh);
77built_in_node!(Aabb, BoundingBox);
78built_in_node!(Instance, Instance);
79built_in_node!(CurveStation, CurveStation);
80built_in_node!(OrientedCurveStation, OrientedCurveStation);
81
82#[cfg(test)]
83mod tests {
84 use axiolid_primitive::Primitive;
85
86 use super::*;
87
88 fn accepts_built_in<T: BuiltInNode>(value: T) -> GeometryNode {
89 value.into()
90 }
91
92 #[test]
93 fn built_in_values_convert_without_format_knowledge() {
94 let node = accepts_built_in(Primitive::Sphere { radius: 2.0 });
95 assert!(matches!(
96 node,
97 GeometryNode::Primitive(Primitive::Sphere { radius: 2.0 })
98 ));
99 }
100}