nodedb_client/
capabilities.rs1use nodedb_types::protocol::{
10 CAP_COLUMNAR, CAP_CRDT, CAP_FTS, CAP_GRAPHRAG, CAP_SPATIAL, CAP_STREAMING, CAP_TIMESERIES,
11};
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
28pub struct Capabilities(pub u64);
29
30impl Capabilities {
31 pub fn from_raw(bits: u64) -> Self {
33 Self(bits)
34 }
35
36 pub fn raw(self) -> u64 {
38 self.0
39 }
40
41 pub fn supports_streaming(self) -> bool {
44 self.0 & CAP_STREAMING != 0
45 }
46
47 pub fn supports_graphrag(self) -> bool {
49 self.0 & CAP_GRAPHRAG != 0
50 }
51
52 pub fn supports_fts(self) -> bool {
55 self.0 & CAP_FTS != 0
56 }
57
58 pub fn supports_crdt(self) -> bool {
60 self.0 & CAP_CRDT != 0
61 }
62
63 pub fn supports_spatial(self) -> bool {
65 self.0 & CAP_SPATIAL != 0
66 }
67
68 pub fn supports_timeseries(self) -> bool {
71 self.0 & CAP_TIMESERIES != 0
72 }
73
74 pub fn supports_columnar(self) -> bool {
77 self.0 & CAP_COLUMNAR != 0
78 }
79
80 pub fn has(self, bit: u64) -> bool {
82 self.0 & bit != 0
83 }
84}
85
86#[cfg(test)]
87mod tests {
88 use super::*;
89 use nodedb_types::protocol::{CAP_FTS, CAP_STREAMING};
90
91 #[test]
92 fn all_bits_set() {
93 let all = CAP_STREAMING
94 | CAP_GRAPHRAG
95 | CAP_FTS
96 | CAP_CRDT
97 | CAP_SPATIAL
98 | CAP_TIMESERIES
99 | CAP_COLUMNAR;
100 let caps = Capabilities::from_raw(all);
101 assert!(caps.supports_streaming());
102 assert!(caps.supports_graphrag());
103 assert!(caps.supports_fts());
104 assert!(caps.supports_crdt());
105 assert!(caps.supports_spatial());
106 assert!(caps.supports_timeseries());
107 assert!(caps.supports_columnar());
108 }
109
110 #[test]
111 fn no_bits_set() {
112 let caps = Capabilities::from_raw(0);
113 assert!(!caps.supports_streaming());
114 assert!(!caps.supports_graphrag());
115 assert!(!caps.supports_fts());
116 assert!(!caps.supports_crdt());
117 assert!(!caps.supports_spatial());
118 assert!(!caps.supports_timeseries());
119 assert!(!caps.supports_columnar());
120 }
121
122 #[test]
123 fn selective_bits() {
124 let caps = Capabilities::from_raw(CAP_STREAMING | CAP_CRDT);
125 assert!(caps.supports_streaming());
126 assert!(caps.supports_crdt());
127 assert!(!caps.supports_graphrag());
128 assert!(!caps.supports_fts());
129 }
130
131 #[test]
132 fn has_arbitrary_bit() {
133 let caps = Capabilities::from_raw(1 << 10);
134 assert!(caps.has(1 << 10));
135 assert!(!caps.has(1 << 11));
136 }
137
138 #[test]
139 fn raw_roundtrip() {
140 let bits = CAP_GRAPHRAG | CAP_FTS;
141 let caps = Capabilities::from_raw(bits);
142 assert_eq!(caps.raw(), bits);
143 }
144
145 #[test]
146 fn default_is_zero() {
147 let caps = Capabilities::default();
148 assert_eq!(caps.raw(), 0);
149 assert!(!caps.supports_streaming());
150 }
151}