#[derive(Debug,Clone,Copy,PartialEq)]
#[repr(usize)]
pub enum Instruments {
Uninstrumented = 0,
MetricsWithoutDiagnostics = Self::METRICS,
MetricsWithDiagnostics = Self::METRICS | Self::METRICS_DIAGNOSTICS,
OperationsTracing = Self::TRACING,
MetricsAndTracing = Self::METRICS | Self::METRICS_DIAGNOSTICS | Self::TRACING,
}
impl Instruments {
const METRICS: usize = 1;
const METRICS_DIAGNOSTICS: usize = 2;
const TRACING: usize = 4;
pub const fn from(instruments: usize) -> Self {
match instruments {
0 => Self::Uninstrumented,
x if x == Self::MetricsWithoutDiagnostics as usize => Self::MetricsWithoutDiagnostics,
x if x == Self::MetricsWithDiagnostics as usize => Self::MetricsWithDiagnostics,
x if x == Self::OperationsTracing as usize => Self::OperationsTracing,
x if x == Self::MetricsAndTracing as usize => Self::MetricsAndTracing,
_ => {
Self::Uninstrumented
},
}
}
#[allow(dead_code)]
pub const fn into(self) -> usize {
match self {
Self::Uninstrumented => 0,
Self::MetricsWithoutDiagnostics => Self::METRICS,
Self::MetricsWithDiagnostics => Self::METRICS | Self::METRICS_DIAGNOSTICS,
Self::OperationsTracing => Self::TRACING,
Self::MetricsAndTracing => Self::METRICS | Self::METRICS_DIAGNOSTICS | Self::TRACING,
}
}
pub const fn metrics(self) -> bool {
matches!(self, Instruments::MetricsWithoutDiagnostics | Instruments::MetricsWithDiagnostics | Instruments::MetricsAndTracing)
}
pub const fn tracing(self) -> bool {
matches!(self, Instruments::OperationsTracing | Instruments::MetricsAndTracing)
}
pub const fn metrics_diagnostics(self) -> bool {
matches!(self, Instruments::MetricsWithDiagnostics | Instruments::MetricsAndTracing)
}
}
#[cfg(any(test,doc))]
mod tests {
use super::*;
#[cfg_attr(not(doc),test)]
fn exhaustive_from_and_into_conversions() {
let all_variants = [
Instruments::Uninstrumented,
Instruments::MetricsWithoutDiagnostics,
Instruments::MetricsWithDiagnostics,
Instruments::OperationsTracing,
Instruments::MetricsAndTracing,
];
for variant in all_variants {
let number = variant.into();
let reconverted = Instruments::from(number);
println!("variant: {:?} -- usize: {}; reconverted to variant: {:?} -- .metrics()={}; .metrics_diagnostics()={}; .tracing()={}",
variant, number, reconverted,
variant.metrics(), variant.metrics_diagnostics(), variant.tracing());
assert_eq!(reconverted, variant, ".into() / .from() failed -- intermediary number is {}", number);
}
}
#[cfg_attr(not(doc),test)]
fn invalid_from() {
assert_eq!(Instruments::from(127), Instruments::Uninstrumented);
}
}