geolite 0.0.9

open source geocode solution
use super::entity::{osm_member_type, osm_relation, osm_relation_member};
use crate::domain::osm_pbf_file::message::relation_msg;
use crate::domain::osm_tag::tag_policy;

pub fn decode(
  relations: &[relation_msg],
  strings: &[&str],
  tags: &tag_policy,
) -> Vec<osm_relation> {
  let mut elements = Vec::new();

  for r in relations {
    let kept = tags.filter(strings, &r.keys, &r.vals);
    let mut memid_acc: i64 = 0;
    let members: Vec<osm_relation_member> = r
      .memids
      .iter()
      .enumerate()
      .map(|(i, &d)| {
        memid_acc += d;
        let role_idx = r.roles_sid.get(i).copied().unwrap_or(0) as usize;
        let role = strings.get(role_idx).unwrap_or(&"").to_string();
        let osm_member_type = match r.types.get(i).copied().unwrap_or(0) {
          1 => osm_member_type::way,
          2 => osm_member_type::relation,
          _ => osm_member_type::node,
        };
        osm_relation_member {
          osm_member_type,
          id: memid_acc,
          role,
        }
      })
      .collect();
    elements.push(osm_relation {
      id: r.id,
      tags: kept
        .into_iter()
        .map(|(k, v)| (k.to_string(), v.to_string()))
        .collect(),
      members,
    });
  }

  elements
}

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