module; #include #include export module routemon:api; import std; import :datex2; import :geo; import :gpx; import :log; import :time; import :trace; namespace { namespace chrono = std::chrono; namespace json = boost::json; namespace views = std::views; } // namespace export namespace routemon::api { struct relevant_road_closure { std::vector relevant_lss; }; struct relevant_situation { std::string id; std::optional location; std::vector comments; std::vector relevant_road_closures; }; struct track_segment { geo::linestring points; }; struct track { std::vector segments; }; struct process_gpx_result { std::vector tracks; std::vector relevant_situations; }; struct sysinfo { time::timestamp using_publication_of; std::size_t blse_index_size; std::size_t p_index_size; }; auto tag_invoke( json::value_from_tag, json::value& jv, relevant_road_closure const& clo) -> void; auto tag_invoke( json::value_from_tag, json::value& jv, relevant_situation const& sit) -> void; auto tag_invoke(json::value_from_tag, json::value& jv, track_segment const& seg) -> void; auto tag_invoke(json::value_from_tag, json::value& jv, track const& track) -> void; auto tag_invoke( json::value_from_tag, json::value& jv, process_gpx_result const& res) -> void; auto tag_invoke(json::value_from_tag, json::value& jv, sysinfo const& info) -> void; class handler { constexpr static auto const min_distance_ = 5.0; using blse_index_value = std::tuple< geo::box, geo::multi_polygon, std::shared_ptr >; using p_index_value = std::pair>; using blse_index = bgeo::index::rtree>; using p_index = bgeo::index::rtree>; log::logger l_; datex2::situation_publication pub_; blse_index blse_index_; p_index p_index_; public: explicit handler(log::logger const& l, datex2::situation_publication pub); auto process_gpx(gpx::file&& gpx_file) -> std::optional; auto sysinfo() -> sysinfo; }; } // namespace routemon::api