axiolid_contracts/
capability_id.rs1use core::fmt;
4
5#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
7pub struct CapabilityId(&'static str);
8
9impl CapabilityId {
10 pub const fn from_static(value: &'static str) -> Self {
11 Self(value)
12 }
13 pub const fn as_str(self) -> &'static str {
14 self.0
15 }
16}
17
18impl fmt::Debug for CapabilityId {
19 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
20 f.debug_tuple("CapabilityId").field(&self.0).finish()
21 }
22}
23impl fmt::Display for CapabilityId {
24 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25 f.write_str(self.0)
26 }
27}
28
29pub mod capability_ids {
30 use super::CapabilityId;
31 pub const TESSELLATE: CapabilityId =
32 CapabilityId::from_static("org.axiolid.geometry.tessellate.v1");
33 pub const MESH_BOOLEAN: CapabilityId =
34 CapabilityId::from_static("org.axiolid.geometry.mesh-boolean.v1");
35 pub const MESH_SECTION: CapabilityId =
36 CapabilityId::from_static("org.axiolid.geometry.mesh-section.v1");
37 pub const POINTCLOUD_RECONSTRUCTION: CapabilityId =
44 CapabilityId::from_static("org.axiolid.geometry.pointcloud-reconstruction.v1");
45 pub const MESH_VALIDATE: CapabilityId =
46 CapabilityId::from_static("org.axiolid.geometry.mesh-validate.v1");
47 pub const MESH_MEASURE: CapabilityId =
48 CapabilityId::from_static("org.axiolid.geometry.mesh-measure.v1");
49 pub const RAY_MESH: CapabilityId =
50 CapabilityId::from_static("org.axiolid.geometry.ray-mesh.v1");
51 pub const EXACT_EXTRUDE: CapabilityId =
52 CapabilityId::from_static("org.axiolid.geometry.exact-extrude.v1");
53 pub const GRAPH_TO_MESH: CapabilityId =
54 CapabilityId::from_static("org.axiolid.geometry.graph-to-mesh.v1");
55 pub const GRAPH_TO_EXACT_BREP: CapabilityId =
60 CapabilityId::from_static("org.axiolid.geometry.graph-to-exact-brep.v1");
61 pub const CURVE_EVALUATE: CapabilityId =
66 CapabilityId::from_static("org.axiolid.geometry.curve-evaluate.v1");
67 pub const ALL: &[CapabilityId] = &[
77 TESSELLATE,
78 MESH_BOOLEAN,
79 MESH_SECTION,
80 MESH_VALIDATE,
81 MESH_MEASURE,
82 RAY_MESH,
83 EXACT_EXTRUDE,
84 GRAPH_TO_MESH,
85 GRAPH_TO_EXACT_BREP,
86 CURVE_EVALUATE,
87 ];
88}
89
90#[cfg(test)]
91mod tests {
92 use super::capability_ids::ALL;
93 use std::collections::BTreeSet;
94
95 #[test]
103 fn the_vocabulary_can_grow_without_a_breaking_change() {
104 let ids: &[super::CapabilityId] = super::capability_ids::ALL;
105 assert!(ids.len() >= 10, "vocabulary should not shrink");
106 }
107 #[test]
108 fn ids_are_unique_versioned_ascii_tokens() {
109 let unique: BTreeSet<_> = ALL.iter().map(|id| id.as_str()).collect();
110 assert_eq!(unique.len(), ALL.len());
111 for id in ALL {
112 let text = id.as_str();
113 assert!(text.ends_with(".v1"));
114 assert!(text
115 .bytes()
116 .all(|b| b.is_ascii_lowercase() || b.is_ascii_digit() || matches!(b, b'.' | b'-')));
117 }
118 }
119}