#![cfg_attr(not(debug_assertions), deny(warnings))]
#![cfg_attr(not(debug_assertions), warn(missing_docs))]
#![cfg_attr(not(debug_assertions), deny(broken_intra_doc_links))]
#![cfg_attr(not(debug_assertions), deny(invalid_codeblock_attributes))]
#![cfg_attr(not(debug_assertions), doc(test(attr(deny(warnings)))))]
#![cfg_attr(not(debug_assertions), doc(test(attr(allow(dead_code)))))]
#![cfg_attr(not(debug_assertions), doc(test(attr(allow(unused_variables)))))]
mod guards;
mod instrumented_future;
mod labels;
mod percentile;
pub use guards::{
DeferredAdd, DeferredAddWithLabels, DeferredCounter, GaugeGuard, GenericGaugeGuard,
GuardedGauge, IntGaugeGuard,
};
pub use instrumented_future::{InstrumentedFuture, IntoInstrumentedFuture};
pub use labels::{
HistogramWithLabels, IntCounterWithLabels, IntGaugeWithLabels, LabelValues, Labels,
};
pub use percentile::{Observations, Sample, TimingBucket, Windowing};
#[allow(missing_docs)]
pub mod paste_crate {
pub use paste::*;
}
#[macro_export]
#[doc(hidden)]
macro_rules! __label_enum_internal {
($(#[$attr:meta])* ($($vis:tt)*) enum $N:ident { $($(#[$var_attr:meta])* $V:ident),* }) => {
$(#[$attr])* $($vis)* enum $N { $($(#[$var_attr])* $V),* }
$crate::paste_crate::paste! {
impl $N {
pub fn as_str(&self) -> &'static str {
match self {
$($N::$V => stringify!([<$V:snake>])),*
}
}
pub fn all_variants() -> Vec<Self> {
vec![$($N::$V),*]
}
}
}
};
}
#[macro_export(local_inner_macros)]
macro_rules! label_enum {
($(#[$attr:meta])* enum $N:ident { $($(#[$var_attr:meta])* $V:ident),* $(,)* }) => {
__label_enum_internal!($(#[$attr])* () enum $N { $($(#[$var_attr])* $V),* });
};
($(#[$attr:meta])* pub enum $N:ident { $($(#[$var_attr:meta])* $V:ident),* $(,)* }) => {
__label_enum_internal!($(#[$attr])* (pub) enum $N { $($(#[$var_attr])* $V),* });
};
($(#[$attr:meta])* pub ($($vis:tt)+) enum $N:ident { $($(#[$var_attr:meta])* $V:ident),* $(,)* }) => {
__label_enum_internal!($(#[$attr])* (pub ($($vis)+)) enum $N { $($(#[$var_attr])* $V),* });
};
}