mm1_logger/
level_filter_trie.rs

1use 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}