use crate::FieldMask;
use std::collections::BTreeMap;
#[derive(Default)]
pub(crate) struct MaskTrie {
pub(crate) children: BTreeMap<String, MaskTrie>, 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
}
}