#[derive(Debug,Clone,Copy,PartialEq)]
#[repr(usize)]
pub enum Instruments {
NoInstruments = 0,
LogsWithoutMetrics = Self::LOG,
LogsWithMetrics = Self::LOG | Self::PERFORMANCE_LOG | Self::COUNTERS | Self::SATURATION | Self::CHEAP_PROFILING,
LogsWithExpensiveMetrics = Self::LOG | Self::PERFORMANCE_LOG | Self::COUNTERS | Self::SATURATION | Self::EXPENSIVE_PROFILING,
MetricsWithoutLogs = Self::COUNTERS | Self::SATURATION | Self::CHEAP_PROFILING,
ExpensiveMetricsWithoutLogs = Self::COUNTERS | Self::SATURATION | Self::EXPENSIVE_PROFILING,
Custom(usize),
}
impl Instruments {
const COUNTERS: usize = 1;
const SATURATION: usize = 2;
const CHEAP_PROFILING: usize = 4;
const EXPENSIVE_PROFILING: usize = 8;
const _PERCENTILES: usize = 16;
const LOG: usize = 32;
const PERFORMANCE_LOG: usize = 64;
const TRACING: usize = 128;
pub const fn from(instruments: usize) -> Self {
Self::Custom(instruments)
}
pub const fn into(self) -> usize {
match self {
Self::NoInstruments => 0,
Self::LogsWithoutMetrics => Self::LOG,
Self::LogsWithMetrics => Self::LOG | Self::PERFORMANCE_LOG | Self::COUNTERS | Self::SATURATION | Self::CHEAP_PROFILING,
Self::LogsWithExpensiveMetrics => Self::LOG | Self::PERFORMANCE_LOG | Self::COUNTERS | Self::SATURATION | Self::EXPENSIVE_PROFILING,
Self::MetricsWithoutLogs => Self::COUNTERS | Self::SATURATION | Self::CHEAP_PROFILING,
Self::ExpensiveMetricsWithoutLogs => Self::COUNTERS | Self::SATURATION | Self::EXPENSIVE_PROFILING,
Self::Custom(instruments) => instruments,
}
}
pub const fn logging(self) -> bool {
self.into() & (Self::LOG | Self::TRACING) > 0
}
pub const fn tracing(self) -> bool {
self.into() & Self::TRACING > 0
}
pub const fn cheap_profiling(self) -> bool {
self.into() & (Self::COUNTERS | Self::SATURATION | Self::CHEAP_PROFILING | Self::EXPENSIVE_PROFILING) > 0
}
pub const fn metrics(self) -> bool {
self.into() & (Self::COUNTERS | Self::SATURATION | Self::CHEAP_PROFILING | Self::EXPENSIVE_PROFILING) > 0
}
}