geolite 0.0.18

open source geocode solution
use rusqlite::Connection;

use super::entity::{leaf, match_sources, query_match};
use super::house_number;
use super::text::resting_point;

pub(super) fn run(
  conn: &Connection,
  iso: &str,
  id: i64,
  path: &[i64],
  number: Option<&str>,
) -> Option<query_match> {
  let mut sources = match_sources::load(conn, iso, &[id]);
  if !sources.paths_of(id).iter().any(|known| known == path) {
    return None;
  }
  sources.load_leaf_boxes(conn);
  let record = crate::admin_level::repository::load_full_by_ids(conn, &[id]).pop()?;
  let geometry = record.wkb.as_ref()?.geometry();
  let resting = resting_point(&record, geometry, &sources, path)?;
  let placed = match number {
    Some(number) => {
      let policy = sources.house_number_policy_of(id);
      Some(house_number::on_street(conn, number, &record, &policy)?)
    }
    None => None,
  };
  let point = placed.as_ref().map_or(resting, |placed| placed.point);
  let reported = placed.as_ref().map(house_number::reported);
  let ancestors = sources.ancestors_of(path.iter());
  let leaf = leaf {
    id: record.id,
    level: record.admin_level,
    name: &record.name,
    relation_id: record.relation_id,
    way_id: record.way_id,
  };
  Some(sources.match_at(&leaf, &ancestors, path, point, reported.as_ref(), None))
}