mm1_logger/
level_filter_trie.rs1use std::collections::HashMap;
2
3#[derive(Debug, Default)]
4pub(crate) struct FilterTrie {
5 level: Option<tracing::Level>,
6 children: HashMap<String, Self>,
7}
8impl FilterTrie {
9 pub(crate) fn level_for_target<'a>(
10 &self,
11 path: impl IntoIterator<Item = &'a str>,
12 ) -> Option<tracing::Level> {
13 let mut path = path.into_iter();
14 if let Some(next) = path.next() {
15 self.children
16 .get(next)
17 .and_then(move |node| node.level_for_target(path))
18 .or_else(|| {
19 self.children
20 .get("*")
21 .and_then(|node| node.level_for_target([]))
22 })
23 } else {
24 self.level
25 }
26 }
27
28 pub(crate) fn from_statements(statements: &[crate::config::LogTargetConfig]) -> Self {
29 let mut root = Self::default();
30
31 for statement in statements {
32 let mut n = &mut root;
33 for mod_name in statement.path.iter() {
34 n = n.children.entry(mod_name.to_owned()).or_default();
35 }
36 n.level = Some(statement.level);
37 }
38 root
39 }
40}