macro_rules! standard_commands {
( $( $(#[$attr:meta])* $variant:ident => $signal:literal / $subcommand:literal ),* $(,)? ) => {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum StandardCommand {
$( $(#[$attr])* $variant, )*
}
impl StandardCommand {
pub const fn signal(self) -> &'static str {
match self {
$( Self::$variant => $signal, )*
}
}
pub const fn subcommand(self) -> &'static str {
match self {
$( Self::$variant => $subcommand, )*
}
}
}
};
}
standard_commands! {
MetricQuery => "metric" / "query",
MetricList => "metric" / "list",
MetricInfo => "metric" / "info",
MetricLabels => "metric" / "labels",
MetricLabelValues => "metric" / "label-values",
MetricSeries => "metric" / "series",
LogSearch => "log" / "search",
TraceSearch => "trace" / "search",
TraceGet => "trace" / "get",
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn signal_and_subcommand_round_trip() {
assert_eq!(StandardCommand::MetricQuery.signal(), "metric");
assert_eq!(StandardCommand::MetricQuery.subcommand(), "query");
assert_eq!(StandardCommand::MetricList.signal(), "metric");
assert_eq!(StandardCommand::MetricList.subcommand(), "list");
assert_eq!(StandardCommand::MetricInfo.signal(), "metric");
assert_eq!(StandardCommand::MetricInfo.subcommand(), "info");
assert_eq!(StandardCommand::MetricLabels.signal(), "metric");
assert_eq!(StandardCommand::MetricLabels.subcommand(), "labels");
assert_eq!(StandardCommand::MetricLabelValues.signal(), "metric");
assert_eq!(
StandardCommand::MetricLabelValues.subcommand(),
"label-values"
);
assert_eq!(StandardCommand::MetricSeries.signal(), "metric");
assert_eq!(StandardCommand::MetricSeries.subcommand(), "series");
assert_eq!(StandardCommand::LogSearch.signal(), "log");
assert_eq!(StandardCommand::LogSearch.subcommand(), "search");
assert_eq!(StandardCommand::TraceSearch.signal(), "trace");
assert_eq!(StandardCommand::TraceSearch.subcommand(), "search");
assert_eq!(StandardCommand::TraceGet.signal(), "trace");
assert_eq!(StandardCommand::TraceGet.subcommand(), "get");
}
}