midenc-log 0.8.1

Provides flexible trace logging for midenc
Documentation
use super::FilterOp;

#[derive(Debug, Clone)]
pub struct KvFilter {
    pub key: String,
    pub patterns: Vec<KvFilterOp>,
}

#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct KvFilterOp {
    pub value: FilterOp,
    pub negated: bool,
}

impl KvFilter {
    pub fn matches(&self, kv: &dyn log::kv::Source) -> Option<bool> {
        let value = kv.get(log::kv::Key::from_str(&self.key))?;
        let value = value.to_borrowed_str()?;

        let mut was_matched = false;
        for pattern in self.patterns.iter() {
            if pattern.value.is_match(value) {
                if pattern.negated {
                    return Some(false);
                }
                was_matched = true;
            }
        }
        Some(was_matched)
    }

    pub fn insert_value_filter(&mut self, pattern: &str, negated: bool) {
        if self
            .patterns
            .iter()
            .any(|p| p.value.as_str() == pattern && p.negated == negated)
        {
            return;
        }
        self.patterns.push(KvFilterOp {
            value: FilterOp::new(pattern).expect("invalid value filter"),
            negated,
        });
    }
}