fieldmasker 0.0.1

A utility for selecting and filtering response fields via field masks.
Documentation
use crate::FieldMask;
use std::collections::BTreeMap;

#[derive(Default)]
pub(crate) struct MaskTrie {
    pub(crate) children: BTreeMap<String, MaskTrie>, // "*" supported
    pub(crate) terminal: bool,
}

impl MaskTrie {
    pub(crate) fn new(mask: &FieldMask) -> Self {
        let mut t = MaskTrie::default();
        for p in &mask.paths {
            t.insert(p);
        }
        t
    }

    fn insert(&mut self, path: &[String]) {
        if path.is_empty() {
            self.terminal = true;
            return;
        }
        self.children
            .entry(path[0].clone())
            .or_default()
            .insert(&path[1..]);
    }

    pub(crate) fn contains_path(&self, segs: &[String]) -> bool {
        let mut node = self;
        for seg in segs {
            if node.terminal {
                return true;
            }
            if let Some(n) = node.children.get(seg) {
                node = n;
            } else if let Some(n) = node.children.get("*") {
                node = n;
            } else {
                return false;
            }
        }
        node.terminal
    }
}