pub trait Key: Copy + Eq + 'static {
fn as_str(self) -> &'static str;
const MAX_KEYS: usize;
const KEYS: &'static [Self];
const KEY_STRS: &'static [&'static str];
fn as_index(self) -> usize;
const DURATION_PATH: &'static [Self];
const TIMESTAMP_PATH: &'static [Self];
const ID_PATH: &'static [Self];
const LOG_KEY: &'static str;
const LEVEL_KEY: &'static str;
const MESSAGE_KEY: &'static str;
}
#[cfg(test)]
pub(crate) mod test_support {
use super::Key;
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
#[repr(u8)]
pub enum TestKey {
Duration,
TotalMs,
Event,
Timestamp,
Id,
Service,
Name,
Version,
Requests,
Status,
Details,
Tag,
Count,
Flag,
}
impl Key for TestKey {
fn as_str(self) -> &'static str {
match self {
TestKey::Duration => "duration",
TestKey::TotalMs => "total_ms",
TestKey::Event => "event",
TestKey::Timestamp => "timestamp",
TestKey::Id => "id",
TestKey::Service => "service",
TestKey::Name => "name",
TestKey::Version => "version",
TestKey::Requests => "requests",
TestKey::Status => "status",
TestKey::Details => "details",
TestKey::Tag => "tag",
TestKey::Count => "count",
TestKey::Flag => "flag",
}
}
const MAX_KEYS: usize = 14;
const KEYS: &'static [Self] = &[
TestKey::Duration,
TestKey::TotalMs,
TestKey::Event,
TestKey::Timestamp,
TestKey::Id,
TestKey::Service,
TestKey::Name,
TestKey::Version,
TestKey::Requests,
TestKey::Status,
TestKey::Details,
TestKey::Tag,
TestKey::Count,
TestKey::Flag,
];
const KEY_STRS: &'static [&'static str] = &[
"duration",
"total_ms",
"event",
"timestamp",
"id",
"service",
"name",
"version",
"requests",
"status",
"details",
"tag",
"count",
"flag",
];
fn as_index(self) -> usize {
self as usize
}
const DURATION_PATH: &'static [Self] = &[TestKey::Duration, TestKey::TotalMs];
const TIMESTAMP_PATH: &'static [Self] = &[TestKey::Event, TestKey::Timestamp];
const ID_PATH: &'static [Self] = &[TestKey::Event, TestKey::Id];
const LOG_KEY: &'static str = "log";
const LEVEL_KEY: &'static str = "level";
const MESSAGE_KEY: &'static str = "message";
}
}
#[cfg(test)]
mod tests {
use super::*;
use test_support::TestKey;
#[test]
fn key_as_str() {
assert_eq!(TestKey::Duration.as_str(), "duration");
assert_eq!(TestKey::TotalMs.as_str(), "total_ms");
assert_eq!(TestKey::Event.as_str(), "event");
assert_eq!(TestKey::Timestamp.as_str(), "timestamp");
assert_eq!(TestKey::Id.as_str(), "id");
assert_eq!(TestKey::Service.as_str(), "service");
assert_eq!(TestKey::Name.as_str(), "name");
assert_eq!(TestKey::Version.as_str(), "version");
assert_eq!(TestKey::Requests.as_str(), "requests");
assert_eq!(TestKey::Status.as_str(), "status");
assert_eq!(TestKey::Details.as_str(), "details");
assert_eq!(TestKey::Tag.as_str(), "tag");
assert_eq!(TestKey::Count.as_str(), "count");
assert_eq!(TestKey::Flag.as_str(), "flag");
}
#[test]
fn key_as_index() {
assert_eq!(TestKey::Duration.as_index(), 0);
assert_eq!(TestKey::TotalMs.as_index(), 1);
assert_eq!(TestKey::Event.as_index(), 2);
assert_eq!(TestKey::Timestamp.as_index(), 3);
assert_eq!(TestKey::Id.as_index(), 4);
assert_eq!(TestKey::Service.as_index(), 5);
assert_eq!(TestKey::Name.as_index(), 6);
assert_eq!(TestKey::Version.as_index(), 7);
assert_eq!(TestKey::Requests.as_index(), 8);
assert_eq!(TestKey::Status.as_index(), 9);
assert_eq!(TestKey::Details.as_index(), 10);
assert_eq!(TestKey::Tag.as_index(), 11);
assert_eq!(TestKey::Count.as_index(), 12);
assert_eq!(TestKey::Flag.as_index(), 13);
}
#[test]
fn max_keys_correct() {
assert_eq!(TestKey::MAX_KEYS, 14);
assert_eq!(TestKey::KEYS.len(), 14);
}
#[test]
fn duration_path_correct() {
assert_eq!(
TestKey::DURATION_PATH,
&[TestKey::Duration, TestKey::TotalMs]
);
}
#[test]
fn timestamp_path_correct() {
assert_eq!(
TestKey::TIMESTAMP_PATH,
&[TestKey::Event, TestKey::Timestamp]
);
}
#[test]
fn id_path_correct() {
assert_eq!(TestKey::ID_PATH, &[TestKey::Event, TestKey::Id]);
}
}