geolite 0.0.12

open source geocode solution
#[derive(Default)]
pub struct tag_policy {
  pub include: Option<Vec<String>>,
  pub ignore: Option<Vec<String>>,
}

impl tag_policy {
  pub fn passes(&self, key: &str) -> bool {
    self
      .include
      .as_ref()
      .is_none_or(|l| l.iter().any(|i| i == key))
      && self
        .ignore
        .as_ref()
        .is_none_or(|l| !l.iter().any(|i| i == key))
  }

  pub fn filter<'a>(
    &self,
    strings: &[&'a str],
    keys: &[u32],
    vals: &[u32],
  ) -> Vec<(&'a str, &'a str)> {
    keys
      .iter()
      .zip(vals.iter())
      .filter_map(|(&k_idx, &v_idx)| {
        let k = strings.get(k_idx as usize)?;
        let v = strings.get(v_idx as usize)?;
        if self.passes(k) { Some((*k, *v)) } else { None }
      })
      .collect()
  }
}