use slog::{Key, Level};
#[derive(Debug, PartialEq, Eq)]
pub enum KVCategory {
Ignore,
Inline,
LevelLog(Level),
}
pub trait KVCategorizer {
fn categorize(&self, key: Key) -> KVCategory;
fn name(&self, key: Key) -> &'static str;
fn ignore(&self, key: Key) -> bool {
self.categorize(key) == KVCategory::Ignore
}
}
pub struct InlineCategorizer;
impl KVCategorizer for InlineCategorizer {
fn categorize(&self, _key: Key) -> KVCategory {
KVCategory::Inline
}
fn name(&self, key: Key) -> &'static str {
key
}
}
pub struct ErrorCategorizer;
impl KVCategorizer for ErrorCategorizer {
fn categorize(&self, key: Key) -> KVCategory {
match key {
"error" => KVCategory::LevelLog(Level::Error),
"cause" => KVCategory::LevelLog(Level::Debug),
"backtrace" => KVCategory::LevelLog(Level::Trace),
_ => InlineCategorizer.categorize(key),
}
}
fn name(&self, key: Key) -> &'static str {
match key {
"error" => "Error",
"cause" => "Caused by",
"backtrace" => "Originated in",
"root_cause" => "Root cause",
_ => InlineCategorizer.name(key),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_inline() {
let categorizer = InlineCategorizer;
let values = vec!["test", "test2"];
for v in values {
assert_eq!(categorizer.categorize(v), KVCategory::Inline);
assert_eq!(categorizer.name(v), v);
}
}
}