liblrs 0.5.0

Library to manipulate linear referencing systems
Documentation
#[allow(unused_imports)]
#[allow(clippy::all)]
#[allow(dead_code)]
#[allow(mismatched_lifetime_syntaxes)]
#[allow(unsafe_op_in_unsafe_fn)]
#[rustfmt::skip]
mod lrs_generated;

#[deny(missing_docs)]
mod osm_helpers;

#[deny(missing_docs)]
pub mod curves;
#[deny(missing_docs)]
pub mod lrm_scale;
#[deny(missing_docs)]
pub mod lrs;
#[deny(missing_docs)]
pub mod lrs_ext;

#[deny(missing_docs)]
pub mod builder;

pub trait DataIssueReporter {
    fn report_ignoring_traversal_edges(
        &mut self,
        traversal_ref: &str,
        ignored_count: usize,
        total_count: usize,
        first_node: i64,
        last_node: i64,
    );
}

pub struct LoggingDataIssueReporter;

impl DataIssueReporter for LoggingDataIssueReporter {
    fn report_ignoring_traversal_edges(
        &mut self,
        traversal_ref: &str,
        ignored_count: usize,
        total_count: usize,
        first_node: i64,
        last_node: i64,
    ) {
        println!(
            "[WARN] on traversal {traversal_ref}, ignoring {ignored_count} edges out of {total_count}. Sorted from {first_node} to {last_node}"
        );
    }
}

impl DataIssueReporter for () {
    fn report_ignoring_traversal_edges(
        &mut self,
        _traversal_ref: &str,
        _ignored_count: usize,
        _total_count: usize,
        _first_node: i64,
        _last_node: i64,
    ) {
    }
}

#[test]
fn read_and_write_lrs() {
    use builder::*;
    use curves::SphericalLineStringCurve;
    use geo::Coord;

    let mut builder = Builder::new();
    let anchor_index = builder.add_anchor(
        "Ancre",
        Some("12"),
        Coord { x: 0., y: 0. },
        properties!("some key" => "some value"),
    );
    let start_node = builder.add_node("a", Coord { x: 0., y: 0. }, properties!());
    let end_node = builder.add_node("b", Coord { x: 1., y: 1. }, properties!());
    let segment_geometry = &[Coord { x: 0., y: 0. }, Coord { x: 1., y: 1. }];
    let segment = SegmentOfTraversal {
        segment_index: builder.add_segment("segment", segment_geometry, start_node, end_node),
        reversed: false,
    };
    let traversal = builder.add_traversal("traversal", &[segment]);
    let anchor_on_lrm = AnchorOnLrm {
        anchor_index,
        distance_along_lrm: 12.0,
    };
    builder.add_lrm("lrm", traversal, &[anchor_on_lrm], properties!());

    let buffer = builder.build_data(properties!("source" => "example"));
    let lrs = lrs::Lrs::<SphericalLineStringCurve>::from_bytes(buffer).unwrap();
    match &lrs.lrms[0].scale.anchors[0] {
        lrm_scale::Anchor::Named(anchor) => assert_eq!(anchor.name, "12"),
        _ => unreachable!(),
    }
}