osm-io 0.3.0

Read and write OSM data
Documentation
use std::fs;

use std::path::PathBuf;
use std::str::FromStr;
use json::JsonValue;
use osm_io::osm::pbf::reader::Reader;
use std::sync::Arc;
use std::sync::atomic::{AtomicI64, Ordering};
use anyhow::Context;
use osm_io::osm::model::element::Element;

pub fn setup() {
    let results_dir_path = PathBuf::from_str("./target/results/").unwrap();

    if !results_dir_path.exists() {
        fs::create_dir_all(&results_dir_path).unwrap_or_else(|_| panic!("Failed to create results directory: {:?}", results_dir_path));
    } else {
        println!("Results directory exists at {:?}", results_dir_path);
    }
}

#[allow(dead_code)]
pub fn read_fixture_analysis(path: &PathBuf) -> JsonValue {
    let fixture_analysis_string = fs::read_to_string(path)
        .with_context(|| format!("path: {}", path.to_string_lossy()))
        .expect("Failed to read fixture analysis file");

    let fixture_analysis = json::parse(fixture_analysis_string.as_str()).unwrap();
    fixture_analysis
}

#[allow(dead_code)]
pub fn analyze_pbf_output(output_path: PathBuf, fixture_analysis_path: PathBuf) {
    let fixture_analysis = read_fixture_analysis(&fixture_analysis_path);
    let test_reader = Reader::new(&output_path).unwrap();
    let atomic_nodes = Arc::new(AtomicI64::new(0));
    let atomic_nodes_clone = atomic_nodes.clone();
    let atomic_ways = Arc::new(AtomicI64::new(0));
    let atomic_ways_clone = atomic_ways.clone();
    let atomic_relations = Arc::new(AtomicI64::new(0));
    let atomic_relations_clone = atomic_relations.clone();
    test_reader.parallel_for_each(
        4,
        move |element| {
                match element {
                    Element::Node { node: _ } => {
                        atomic_nodes.fetch_add(1, Ordering::SeqCst);
                    }
                    Element::Way { way: _ } => {
                        atomic_ways.fetch_add(1, Ordering::SeqCst);
                    }
                    Element::Relation { relation: _ } => {
                        atomic_relations.fetch_add(1, Ordering::SeqCst);
                    }
                    Element::Sentinel => {}
                }
            Ok(())
        }
    ).unwrap();
    assert_eq!(atomic_nodes_clone.fetch_or(0, Ordering::SeqCst), fixture_analysis["data"]["count"]["nodes"].as_i64().unwrap());
    assert_eq!(atomic_ways_clone.fetch_or(0, Ordering::SeqCst), fixture_analysis["data"]["count"]["ways"].as_i64().unwrap());
    assert_eq!(atomic_relations_clone.fetch_or(0, Ordering::SeqCst), fixture_analysis["data"]["count"]["relations"].as_i64().unwrap());
}