geolite 0.0.9

open source geocode solution
use super::value::house_number;
use super::policy::house_number_policy;

pub fn has_house_number(query: &str, policy: &house_number_policy) -> bool {
  query
    .split_whitespace()
    .any(|token| house_number::recognize(token, policy).is_some())
}

pub fn first_house_number(
  query: &str,
  street_name: &str,
  policy: &house_number_policy,
) -> Option<house_number> {
  let tokens: Vec<&str> = query.split_whitespace().collect();
  let mut index = 0;
  while index < tokens.len() {
    let token = tokens[index];
    let (candidate, consumed) = match tokens.get(index + 1) {
      Some(next) if policy.allow_hash_prefix && token == "#" => (*next, 2),
      _ => (token, 1),
    };
    if !name_contains_token(street_name, candidate)
      && let Some(number) = house_number::recognize(candidate, policy)
    {
      return Some(number);
    }
    index += consumed;
  }
  None
}

fn name_contains_token(name: &str, token: &str) -> bool {
  name
    .split(|c: char| !c.is_alphanumeric())
    .any(|part| part.eq_ignore_ascii_case(token))
}

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