geolite 0.0.8

open source geocode solution
use super::scale::level;
use crate::database::osm_ways::filters;

#[derive(Clone, Copy)]
pub struct extraction_rules {
  pub level: level,
  pub include: &'static [filters],
  pub exclude: &'static [filters],
}

fn default_include(level: level) -> &'static [filters] {
  match level {
    level::neighborhood => &[
      filters::include_place_neighbourhood,
      filters::include_place_suburb,
    ],
    _ => &[],
  }
}

fn default_exclude(level: level) -> &'static [filters] {
  match level {
    level::street => &[
      filters::exclude_place_neighbourhood,
      filters::exclude_place_suburb,
      filters::exclude_leisure_park,
      filters::exclude_building,
      filters::exclude_waterway,
    ],
    _ => &[],
  }
}

pub(super) fn resolve_rules(
  level: level,
  overrides: &[extraction_rules],
) -> (&'static [filters], &'static [filters]) {
  if let Some(r) = overrides.iter().find(|r| r.level == level) {
    return (r.include, r.exclude);
  }
  (default_include(level), default_exclude(level))
}

#[cfg(test)]
#[path = "rules.test.rs"]
mod tests;