use std::collections::hash_map::Iter;
use std::collections::hash_map::Keys;
use std::collections::HashMap;
use log::LevelFilter;
#[derive(Default)]
pub struct LevelConfig {
config: HashMap<String, LevelFilter>,
generation: u64,
origin_generation: u64,
default_display_level: Option<LevelFilter>,
}
impl LevelConfig {
pub fn new() -> LevelConfig {
LevelConfig {
config: HashMap::new(),
generation: 0,
origin_generation: 0,
default_display_level: None,
}
}
pub fn set(&mut self, target: &str, level: LevelFilter) {
if let Some(lev) = self.config.get_mut(target) {
if *lev != level {
*lev = level;
self.generation += 1;
}
return;
}
self.config.insert(target.to_string(), level);
self.generation += 1;
}
pub fn set_default_display_level(&mut self, level: LevelFilter) {
self.default_display_level = Some(level);
}
pub fn get_default_display_level(&self) -> Option<LevelFilter> {
self.default_display_level
}
pub fn keys(&self) -> Keys<'_, String, LevelFilter> {
self.config.keys()
}
pub fn get(&self, target: &str) -> Option<LevelFilter> {
self.config.get(target).cloned()
}
pub fn iter(&self) -> Iter<'_, String, LevelFilter> {
self.config.iter()
}
pub(crate) fn merge(&mut self, origin: &LevelConfig) {
if self.origin_generation != origin.generation {
for (target, origin_levelfilter) in origin.iter() {
if let Some(levelfilter) = self.get(target) {
if levelfilter <= *origin_levelfilter {
continue;
}
}
let levelfilter = self
.default_display_level
.map(|lvl| {
if lvl > *origin_levelfilter {
*origin_levelfilter
} else {
lvl
}
})
.unwrap_or(*origin_levelfilter);
self.set(target, levelfilter);
}
self.generation = origin.generation;
}
}
}