1use std::ops::BitOr;
2
3#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
10pub enum MetricKind {
11 Counter,
13 Gauge,
15 Histogram,
17}
18
19#[derive(Debug, Eq, PartialEq, Hash, Clone, Copy, Ord, PartialOrd)]
50pub struct MetricKindMask(u8);
51
52impl MetricKindMask {
53 pub const NONE: MetricKindMask = MetricKindMask(0);
55
56 pub const COUNTER: MetricKindMask = MetricKindMask(1);
58
59 pub const GAUGE: MetricKindMask = MetricKindMask(2);
61
62 pub const HISTOGRAM: MetricKindMask = MetricKindMask(4);
64
65 pub const ALL: MetricKindMask = MetricKindMask(7);
67
68 #[inline]
69 fn value(&self) -> u8 {
70 self.0
71 }
72
73 pub fn matches(&self, kind: MetricKind) -> bool {
75 match kind {
76 MetricKind::Counter => self.0 & MetricKindMask::COUNTER.value() != 0,
77 MetricKind::Gauge => self.0 & MetricKindMask::GAUGE.value() != 0,
78 MetricKind::Histogram => self.0 & MetricKindMask::HISTOGRAM.value() != 0,
79 }
80 }
81}
82
83impl BitOr for MetricKindMask {
84 type Output = Self;
85
86 fn bitor(self, rhs: Self) -> Self::Output {
87 Self(self.0 | rhs.0)
88 }
89}
90
91#[cfg(test)]
92mod tests {
93 use super::MetricKindMask;
94 use crate::MetricKind;
95
96 #[test]
97 fn test_matching() {
98 let cmask = MetricKindMask::COUNTER;
99 let gmask = MetricKindMask::GAUGE;
100 let hmask = MetricKindMask::HISTOGRAM;
101 let nmask = MetricKindMask::NONE;
102 let amask = MetricKindMask::ALL;
103
104 assert!(cmask.matches(MetricKind::Counter));
105 assert!(!cmask.matches(MetricKind::Gauge));
106 assert!(!cmask.matches(MetricKind::Histogram));
107
108 assert!(!gmask.matches(MetricKind::Counter));
109 assert!(gmask.matches(MetricKind::Gauge));
110 assert!(!gmask.matches(MetricKind::Histogram));
111
112 assert!(!hmask.matches(MetricKind::Counter));
113 assert!(!hmask.matches(MetricKind::Gauge));
114 assert!(hmask.matches(MetricKind::Histogram));
115
116 assert!(amask.matches(MetricKind::Counter));
117 assert!(amask.matches(MetricKind::Gauge));
118 assert!(amask.matches(MetricKind::Histogram));
119
120 assert!(!nmask.matches(MetricKind::Counter));
121 assert!(!nmask.matches(MetricKind::Gauge));
122 assert!(!nmask.matches(MetricKind::Histogram));
123 }
124}