{"action":"created","comment":{"url":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls/comments/193454961","pull_request_review_id":126408620,"id":193454961,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5MzQ1NDk2MQ==","diff_hunk":"@@ -0,0 +1,430 @@\n+#include \"parsers/xml/stations_and_request_stops.hpp\"\n+#include \"utils.hpp\"\n+#include <gsl/gsl_util>\n+#include <rapidxml_ns.hpp>\n+#include <sstream>\n+#include <string>\n+#include <unordered_map>\n+\n+using namespace std::string_literals;\n+\n+namespace parsers {\n+namespace xml {\n+\tnamespace stations_and_stops {\n+\t\tnamespace {\n+\t\t\tstation_marker::doors parse_doors_text(std::string const& filename,\n+\t\t\t                                       rapidxml_ns::xml_node<char>* doors_node,\n+\t\t\t                                       errors::multi_error_t& errors) {\n+\t\t\t\tstatic std::unordered_map<std::string, station_marker::doors> text_mapping{\n+\t\t\t\t    //\n+\t\t\t\t    {\"left\", station_marker::doors::left},\n+\t\t\t\t    {\"right\", station_marker::doors::right},\n+\t\t\t\t    {\"none\", station_marker::doors::none}\n+\t\t\t\t    //\n+\t\t\t\t};\n+\t\t\t\tstd::string door;\n+\t\t\t\ttry {\n+\t\t\t\t\tdoor = doors_node->value();\n+\t\t\t\t\tutil::lower(door);\n+\t\t\t\t}\n+\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t\tdoor = \"none\";\n+\t\t\t\t}\n+\t\t\t\tauto const parsed_doors = text_mapping.find(door);\n+\n+\t\t\t\tif (parsed_doors != text_mapping.end())\n+\t\t\t\t\treturn parsed_doors->second;\n+\n+\t\t\t\tadd_error(errors, filename, 0, \"Error: <Doors> given and invalid option\");\n+\t\t\t\treturn station_marker::doors::none;\n+\t\t\t}\n+\t\t\trequest_stop_marker::behaviour parse_ai_behaviour(\n+\t\t\t    std::string const& filename,\n+\t\t\t    rapidxml_ns::xml_node<char>* ai_behaviour_node,\n+\t\t\t    errors::multi_error_t& errors) {\n+\t\t\t\tstatic std::unordered_map<std::string, request_stop_marker::behaviour>\n+\t\t\t\t    text_mapping{{\"fullspeed\", request_stop_marker::behaviour::fullspeed},\n+\t\t\t\t                 {\"normalbrake\", request_stop_marker::behaviour::normalbrake}};\n+\t\t\t\tstd::string behaviour;\n+\t\t\t\ttry {\n+\t\t\t\t\tbehaviour = ai_behaviour_node->value();\n+\t\t\t\t\tutil::lower(behaviour);\n+\t\t\t\t}\n+\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t\tbehaviour = \"normalbrake\"s;\n+\t\t\t\t}\n+\t\t\t\tauto const parsed_behaviour = text_mapping.find(behaviour);\n+\n+\t\t\t\tif (parsed_behaviour != text_mapping.end())\n+\t\t\t\t\treturn parsed_behaviour->second;\n+\n+\t\t\t\tadd_error(errors, filename, 0, \"Error: <AIBehaviour> given invalid behaviour\");\n+\t\t\t\treturn request_stop_marker::behaviour::normalbrake;\n+\t\t\t}\n+\n+\t\t\tsub_message parse_sub_messages_nodes(rapidxml_ns::xml_node<char>* parent_node) {\n+\t\t\t\tauto* early_node = parent_node->first_node(\"early\", 0, false);\n+\t\t\t\tauto* on_time_node = parent_node->first_node(\"ontime\", 0, false);\n+\t\t\t\tauto* late_node = parent_node->first_node(\"late\", 0, false);\n+\t\t\t\tsub_message sub_nodes;\n+\n+\t\t\t\t// There are no sub nodes so return a struct with values of \"parent_node\".\n+\t\t\t\tif (early_node == nullptr && on_time_node == nullptr && late_node == nullptr) {\n+\t\t\t\t\tsub_nodes.early = parent_node->value();\n+\t\t\t\t\tsub_nodes.ontime = parent_node->value();\n+\t\t\t\t\tsub_nodes.late = parent_node->value();\n+\t\t\t\t\treturn sub_nodes;\n+\t\t\t\t}\n+\n+\t\t\t\tif (early_node != nullptr) {\n+\t\t\t\t\tsub_nodes.early = early_node->value();\n+\t\t\t\t}\n+\t\t\t\telse {\n+\t\t\t\t\tsub_nodes.early = std::string{};\n+\t\t\t\t}\n+\n+\t\t\t\tif (on_time_node != nullptr) {\n+\t\t\t\t\tsub_nodes.ontime = on_time_node->value();\n+\t\t\t\t}\n+\t\t\t\telse {\n+\t\t\t\t\tsub_nodes.ontime = std::string{};\n+\t\t\t\t}\n+\n+\t\t\t\tif (late_node != nullptr) {\n+\t\t\t\t\tsub_nodes.late = late_node->value();\n+\t\t\t\t}\n+\t\t\t\telse {\n+\t\t\t\t\tsub_nodes.late = std::string{};\n+\t\t\t\t}\n+\n+\t\t\t\treturn sub_nodes;\n+\t\t\t}\n+\n+\t\t\tprobabilities parse_probabilities_nodes(std::string const& filename,\n+\t\t\t                                        rapidxml_ns::xml_node<char>* parent_node,\n+\t\t\t                                        errors::multi_error_t& errors) {\n+\t\t\t\tauto* early_node = parent_node->first_node(\"early\", 0, false);\n+\t\t\t\tauto* on_time_node = parent_node->first_node(\"ontime\", 0, false);\n+\t\t\t\tauto* late_node = parent_node->first_node(\"late\", 0, false);\n+\t\t\t\tprobabilities sub_nodes;\n+\n+\t\t\t\t// There are no sub nodes so return a struct with values of \"parent_node\".\n+\t\t\t\tif (early_node == nullptr && on_time_node == nullptr && late_node == nullptr) {\n+\t\t\t\t\tstd::intmax_t no_sub_values;\n+\t\t\t\t\ttry {\n+\t\t\t\t\t\tno_sub_values = util::parse_loose_integer(parent_node->value());\n+\t\t\t\t\t}\n+\t\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\t\tno_sub_values = 0;\n+\t\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t\t}\n+\t\t\t\t\tif (no_sub_values < 0 || no_sub_values > 100) {\n+\t\t\t\t\t\tadd_error(errors, filename, 0,\n+\t\t\t\t\t\t          \"<Probability> has to be between 0 and 100 but found\"\n+\t\t\t\t\t\t              + no_sub_values);\n+\t\t\t\t\t\tno_sub_values = 0;\n+\t\t\t\t\t}\n+\t\t\t\t\tsub_nodes.early = gsl::narrow<std::uint8_t>(no_sub_values);\n+\t\t\t\t\tsub_nodes.ontime = gsl::narrow<std::uint8_t>(no_sub_values);\n+\t\t\t\t\tsub_nodes.late = gsl::narrow<std::uint8_t>(no_sub_values);\n+\t\t\t\t\treturn sub_nodes;\n+\t\t\t\t}\n+\n+\t\t\t\tif (early_node != nullptr) {\n+\t\t\t\t\tstd::intmax_t prob;\n+\t\t\t\t\ttry {\n+\t\t\t\t\t\tprob = util::parse_loose_integer(early_node->value());\n+\t\t\t\t\t}\n+\t\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t\t\tprob = 0;\n+\t\t\t\t\t}\n+\n+\t\t\t\t\tif (prob < 0 || prob > 100) {\n+\t\t\t\t\t\tadd_error(errors, filename, 0,\n+\t\t\t\t\t\t          \"<Probability> has to be between 0 and 100 but found\" + prob);\n+\t\t\t\t\t\tprob = 0;\n+\t\t\t\t\t}\n+\t\t\t\t\tsub_nodes.early = gsl::narrow<std::uint8_t>(prob);\n+\t\t\t\t}\n+\t\t\t\telse {\n+\t\t\t\t\tsub_nodes.early = std::uint8_t{};\n+\t\t\t\t}\n+\n+\t\t\t\tif (on_time_node != nullptr) {\n+\t\t\t\t\tstd::intmax_t prob;\n+\t\t\t\t\ttry {\n+\t\t\t\t\t\tprob = util::parse_loose_integer(on_time_node->value());\n+\t\t\t\t\t}\n+\t\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t\t\tprob = 0;\n+\t\t\t\t\t}\n+\n+\t\t\t\t\tif (prob < 0 || prob > 100) {\n+\t\t\t\t\t\tadd_error(errors, filename, 0,\n+\t\t\t\t\t\t          \"<Probability> has to be between 0 and 100 but found\" + prob);\n+\t\t\t\t\t\tprob = 0;\n+\t\t\t\t\t}\n+\t\t\t\t\tsub_nodes.ontime = gsl::narrow<std::uint8_t>(prob);\n+\t\t\t\t}\n+\t\t\t\telse {\n+\t\t\t\t\tsub_nodes.ontime = std::uint8_t{};\n+\t\t\t\t}\n+\n+\t\t\t\tif (late_node != nullptr) {\n+\t\t\t\t\tstd::intmax_t prob;\n+\t\t\t\t\ttry {\n+\t\t\t\t\t\tprob = util::parse_loose_integer(late_node->value());\n+\t\t\t\t\t}\n+\t\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t\t\tprob = 0;\n+\t\t\t\t\t}\n+\n+\t\t\t\t\tif (prob < 0 || prob > 100) {\n+\t\t\t\t\t\tadd_error(errors, filename, 0,\n+\t\t\t\t\t\t          \"<Probability> has to be between 0 and 100 but found\" + prob);\n+\t\t\t\t\t\tprob = 0;\n+\t\t\t\t\t}\n+\t\t\t\t\tsub_nodes.late = gsl::narrow<std::uint8_t>(prob);\n+\t\t\t\t}\n+\t\t\t\telse {\n+\t\t\t\t\tsub_nodes.late = std::uint8_t{};\n+\t\t\t\t}\n+\n+\t\t\t\treturn sub_nodes;\n+\t\t\t}\n+\t\t\t//////////////////////////////////\n+\t\t\t////PARSE REQUEST STOP MARKER////\n+\t\t\t//////////////////////////////////\n+\t\t\trequest_stop_marker parse_request_stop_marker(\n+\t\t\t    const std::string filename,\n+\t\t\t    rapidxml_ns::xml_node<char>* start_node,\n+\t\t\t    errors::multi_error_t& errors,\n+\t\t\t    const find_relative_file_func& /*get_relative_file*/) {\n+\t\t\t\trequest_stop_marker rs;\n+\n+\t\t\t\tauto* early_time_node = start_node->first_node(\"earlytime\", 0, false);\n+\t\t\t\tauto* late_time_node = start_node->first_node(\"latetime\", 0, false);\n+\t\t\t\tauto* distance_node = start_node->first_node(\"distance\", 0, false);\n+\t\t\t\tauto* stop_message_node = start_node->first_node(\"stopmessage\", 0, false);\n+\t\t\t\tauto* pass_message_node = start_node->first_node(\"passmessage\", 0, false);\n+\t\t\t\tauto* probability_node = start_node->first_node(\"probability\", 0, false);\n+\t\t\t\tauto* max_cars_node = start_node->first_node(\"maxcars\", 0, false);\n+\t\t\t\tauto* ai_behaviour_node = start_node->first_node(\"aibehaviour\", 0, false);\n+\n+\t\t\t\tif (early_time_node != nullptr) {\n+\t\t\t\t\ttry {\n+\t\t\t\t\t\trs.early_time = util::parse_time(early_time_node->value());\n+\t\t\t\t\t}\n+\t\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t\t\trs.early_time = 0;\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\n+\t\t\t\tif (late_time_node != nullptr) {\n+\t\t\t\t\ttry {\n+\t\t\t\t\t\trs.late_time = util::parse_time(late_time_node->value());\n+\t\t\t\t\t}\n+\t\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t\t\trs.late_time = 0;\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\n+\t\t\t\tif (distance_node != nullptr) {\n+\t\t\t\t\ttry {\n+\t\t\t\t\t\trs.distance = util::parse_loose_float(distance_node->value());\n+\t\t\t\t\t}\n+\t\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t\t\trs.distance = 0;\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\n+\t\t\t\tif (stop_message_node != nullptr) {\n+\t\t\t\t\trs.stop_message = parse_sub_messages_nodes(stop_message_node);\n+\t\t\t\t}\n+\n+\t\t\t\tif (pass_message_node != nullptr) {\n+\t\t\t\t\trs.pass_message = parse_sub_messages_nodes(pass_message_node);\n+\t\t\t\t}\n+\n+\t\t\t\tif (probability_node != nullptr) {\n+\t\t\t\t\trs.probability = parse_probabilities_nodes(filename, probability_node, errors);\n+\t\t\t\t}\n+\n+\t\t\t\tif (max_cars_node != nullptr) {\n+\t\t\t\t\ttry {\n+\t\t\t\t\t\tauto cars = util::parse_loose_integer(max_cars_node->value());\n+\t\t\t\t\t\tif (cars < 0) {\n+\t\t\t\t\t\t\tadd_error(errors, filename, 0,\n+\t\t\t\t\t\t\t          \"Error: <MaxCars> should have be a non negative intger\");\n+\t\t\t\t\t\t\tcars = 0;\n+\t\t\t\t\t\t}\n+\t\t\t\t\t\trs.max_cars = cars;\n+\t\t\t\t\t}\n+\t\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t\t\trs.max_cars = 0;\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\n+\t\t\t\tif (ai_behaviour_node != nullptr) {\n+\t\t\t\t\trs.ai_behaviour = parse_ai_behaviour(filename, ai_behaviour_node, errors);\n+\t\t\t\t}\n+\t\t\t\treturn rs;\n+\t\t\t}\n+\t\t} // namespace\n+\n+\t\t/////////////////////////////\n+\t\t//// PARSE STATION MARKER////\n+\t\t/////////////////////////////\n+\t\tparsed_station_marker parse_station_marker(\n+\t\t    const std::string filename,\n+\t\t    rapidxml_ns::xml_node<char>* start_node,\n+\t\t    errors::multi_error_t& errors,\n+\t\t    const find_relative_file_func& get_relative_file) {\n+\t\t\tstation_marker sm;\n+\t\t\tauto* name_node = start_node->first_node(\"name\", 0, false);\n+\t\t\tauto* arrival_time_node = start_node->first_node(\"arrivaltime\", 0, false);\n+\t\t\tauto* departure_time_node = start_node->first_node(\"departuretime\", 0, false);\n+\t\t\tauto* doors_node = start_node->first_node(\"doors\", 0, false);\n+\t\t\tauto* red_signal_node = start_node->first_node(\"forcedredsignal\", 0, false);\n+\t\t\tauto* passenger_ratio_node = start_node->first_node(\"passengerratio\", 0, false);\n+\t\t\tauto* arrival_sound_node = start_node->first_node(\"arrivalsound\", 0, false);\n+\t\t\tauto* departure_sound_node = start_node->first_node(\"depaturesound\", 0, false);\n+\t\t\tauto* stop_duration_node = start_node->first_node(\"stopduration\", 0, false);\n+\t\t\tauto* time_table_index_node = start_node->first_node(\"timetableindex\", 0, false);\n+\t\t\tauto* request_stop_node = start_node->first_node(\"requeststop\", 0, false);\n+\n+\t\t\tif (name_node != nullptr) {\n+\t\t\t\tsm.station_name = std::string(name_node->value(), name_node->value_size());\n+\t\t\t}\n+\n+\t\t\tif (arrival_time_node != nullptr) {\n+\t\t\t\ttry {\n+\t\t\t\t\tsm.arrival_time = util::parse_time(arrival_time_node->value());\n+\t\t\t\t}\n+\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\tsm.arrival_time = 0;\n+\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\tif (departure_time_node != nullptr) {\n+\t\t\t\ttry {\n+\t\t\t\t\tsm.departure_time = util::parse_time(departure_time_node->value());\n+\t\t\t\t}\n+\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\tsm.departure_time = 0;\n+\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\tif (doors_node != nullptr) {\n+\t\t\t\tsm.door = parse_doors_text(filename, doors_node, errors);\n+\t\t\t}\n+\n+\t\t\tif (red_signal_node != nullptr) {\n+\t\t\t\tstd::string red_signal = red_signal_node->value();\n+\t\t\t\tutil::lower(red_signal);\n+\t\t\t\tsm.force_red_signal = \"true\"s == red_signal;\n+\t\t\t}\n+\n+\t\t\tif (passenger_ratio_node != nullptr) {\n+\t\t\t\ttry {\n+\t\t\t\t\tauto ratio = util::parse_loose_integer(passenger_ratio_node->value());\n+\t\t\t\t\tif (ratio < 0 || ratio > 250) {\n+\t\t\t\t\t\tadd_error(errors, filename, 0,\n+\t\t\t\t\t\t          \"Out of bounds Error: PassengerRatio has to be a integer between \"\n+\t\t\t\t\t\t          \"0 and 250.\");\n+\t\t\t\t\t\tratio = 0;\n+\t\t\t\t\t}\n+\t\t\t\t\tsm.passenger_ratio = gsl::narrow<std::uint8_t>(ratio);\n+\t\t\t\t}\n+\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\tsm.passenger_ratio = 0;\n+\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\tif (arrival_sound_node != nullptr) {\n+\t\t\t\tsm.arrival_sound_file = get_relative_file(filename, arrival_sound_node->value());\n+\t\t\t}\n+\n+\t\t\tif (departure_sound_node != nullptr) {\n+\t\t\t\tsm.departure_sound_file =\n+\t\t\t\t    get_relative_file(filename, departure_sound_node->value());\n+\t\t\t}\n+\n+\t\t\tif (stop_duration_node != nullptr) {\n+\t\t\t\ttry {\n+\t\t\t\t\tsm.stop_duration = util::parse_loose_integer(stop_duration_node->value(), 15);\n+\t\t\t\t}\n+\t\t\t\tcatch (std::exception const& e) {\n+\t\t\t\t\tsm.stop_duration = 0;\n+\t\t\t\t\tadd_error(errors, filename, 0, e.what());\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif (time_table_index_node != nullptr) {\n+\t\t\t\tauto index = util::parse_loose_integer((time_table_index_node->value()));","path":"libparsers/src/xml/stations_and_request_stops.cpp","position":375,"original_position":375,"commit_id":"ba393212de8e54dc97d685957bbd9faf45d6ff77","original_commit_id":"ba393212de8e54dc97d685957bbd9faf45d6ff77","user":{"login":"cwfitzgerald","id":7861353,"node_id":"MDQ6VXNlcjc4NjEzNTM=","avatar_url":"https://avatars2.githubusercontent.com/u/7861353?v=4","gravatar_id":"","url":"https://api.github.com/users/cwfitzgerald","html_url":"https://github.com/cwfitzgerald","followers_url":"https://api.github.com/users/cwfitzgerald/followers","following_url":"https://api.github.com/users/cwfitzgerald/following{/other_user}","gists_url":"https://api.github.com/users/cwfitzgerald/gists{/gist_id}","starred_url":"https://api.github.com/users/cwfitzgerald/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cwfitzgerald/subscriptions","organizations_url":"https://api.github.com/users/cwfitzgerald/orgs","repos_url":"https://api.github.com/users/cwfitzgerald/repos","events_url":"https://api.github.com/users/cwfitzgerald/events{/privacy}","received_events_url":"https://api.github.com/users/cwfitzgerald/received_events","type":"User","site_admin":false},"body":"Unnecessary parenthesis. ","created_at":"2018-06-06T15:30:39Z","updated_at":"2018-06-06T15:52:05Z","html_url":"https://github.com/cwfitzgerald/openbve2/pull/12#discussion_r193454961","pull_request_url":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls/12","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls/comments/193454961"},"html":{"href":"https://github.com/cwfitzgerald/openbve2/pull/12#discussion_r193454961"},"pull_request":{"href":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls/12"}}},"pull_request":{"url":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls/12","id":192780727,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkyNzgwNzI3","html_url":"https://github.com/cwfitzgerald/openbve2/pull/12","diff_url":"https://github.com/cwfitzgerald/openbve2/pull/12.diff","patch_url":"https://github.com/cwfitzgerald/openbve2/pull/12.patch","issue_url":"https://api.github.com/repos/cwfitzgerald/openbve2/issues/12","number":12,"state":"open","locked":false,"title":"Parser for stations and request stop with test case.","user":{"login":"KevinCybura","id":21002424,"node_id":"MDQ6VXNlcjIxMDAyNDI0","avatar_url":"https://avatars2.githubusercontent.com/u/21002424?v=4","gravatar_id":"","url":"https://api.github.com/users/KevinCybura","html_url":"https://github.com/KevinCybura","followers_url":"https://api.github.com/users/KevinCybura/followers","following_url":"https://api.github.com/users/KevinCybura/following{/other_user}","gists_url":"https://api.github.com/users/KevinCybura/gists{/gist_id}","starred_url":"https://api.github.com/users/KevinCybura/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KevinCybura/subscriptions","organizations_url":"https://api.github.com/users/KevinCybura/orgs","repos_url":"https://api.github.com/users/KevinCybura/repos","events_url":"https://api.github.com/users/KevinCybura/events{/privacy}","received_events_url":"https://api.github.com/users/KevinCybura/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-06-05T17:24:22Z","updated_at":"2018-06-06T15:52:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"25f6403918cd10f9e17508ea3dc5583844a0b6d2","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls/12/commits","review_comments_url":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls/12/comments","review_comment_url":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls/comments{/number}","comments_url":"https://api.github.com/repos/cwfitzgerald/openbve2/issues/12/comments","statuses_url":"https://api.github.com/repos/cwfitzgerald/openbve2/statuses/ba393212de8e54dc97d685957bbd9faf45d6ff77","head":{"label":"cwfitzgerald:feature-libparser-xml-station_and_request_stops","ref":"feature-libparser-xml-station_and_request_stops","sha":"ba393212de8e54dc97d685957bbd9faf45d6ff77","user":{"login":"cwfitzgerald","id":7861353,"node_id":"MDQ6VXNlcjc4NjEzNTM=","avatar_url":"https://avatars2.githubusercontent.com/u/7861353?v=4","gravatar_id":"","url":"https://api.github.com/users/cwfitzgerald","html_url":"https://github.com/cwfitzgerald","followers_url":"https://api.github.com/users/cwfitzgerald/followers","following_url":"https://api.github.com/users/cwfitzgerald/following{/other_user}","gists_url":"https://api.github.com/users/cwfitzgerald/gists{/gist_id}","starred_url":"https://api.github.com/users/cwfitzgerald/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cwfitzgerald/subscriptions","organizations_url":"https://api.github.com/users/cwfitzgerald/orgs","repos_url":"https://api.github.com/users/cwfitzgerald/repos","events_url":"https://api.github.com/users/cwfitzgerald/events{/privacy}","received_events_url":"https://api.github.com/users/cwfitzgerald/received_events","type":"User","site_admin":false},"repo":{"id":115062977,"node_id":"MDEwOlJlcG9zaXRvcnkxMTUwNjI5Nzc=","name":"openbve2","full_name":"cwfitzgerald/openbve2","owner":{"login":"cwfitzgerald","id":7861353,"node_id":"MDQ6VXNlcjc4NjEzNTM=","avatar_url":"https://avatars2.githubusercontent.com/u/7861353?v=4","gravatar_id":"","url":"https://api.github.com/users/cwfitzgerald","html_url":"https://github.com/cwfitzgerald","followers_url":"https://api.github.com/users/cwfitzgerald/followers","following_url":"https://api.github.com/users/cwfitzgerald/following{/other_user}","gists_url":"https://api.github.com/users/cwfitzgerald/gists{/gist_id}","starred_url":"https://api.github.com/users/cwfitzgerald/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cwfitzgerald/subscriptions","organizations_url":"https://api.github.com/users/cwfitzgerald/orgs","repos_url":"https://api.github.com/users/cwfitzgerald/repos","events_url":"https://api.github.com/users/cwfitzgerald/events{/privacy}","received_events_url":"https://api.github.com/users/cwfitzgerald/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/cwfitzgerald/openbve2","description":null,"fork":false,"url":"https://api.github.com/repos/cwfitzgerald/openbve2","forks_url":"https://api.github.com/repos/cwfitzgerald/openbve2/forks","keys_url":"https://api.github.com/repos/cwfitzgerald/openbve2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cwfitzgerald/openbve2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cwfitzgerald/openbve2/teams","hooks_url":"https://api.github.com/repos/cwfitzgerald/openbve2/hooks","issue_events_url":"https://api.github.com/repos/cwfitzgerald/openbve2/issues/events{/number}","events_url":"https://api.github.com/repos/cwfitzgerald/openbve2/events","assignees_url":"https://api.github.com/repos/cwfitzgerald/openbve2/assignees{/user}","branches_url":"https://api.github.com/repos/cwfitzgerald/openbve2/branches{/branch}","tags_url":"https://api.github.com/repos/cwfitzgerald/openbve2/tags","blobs_url":"https://api.github.com/repos/cwfitzgerald/openbve2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cwfitzgerald/openbve2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cwfitzgerald/openbve2/git/refs{/sha}","trees_url":"https://api.github.com/repos/cwfitzgerald/openbve2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cwfitzgerald/openbve2/statuses/{sha}","languages_url":"https://api.github.com/repos/cwfitzgerald/openbve2/languages","stargazers_url":"https://api.github.com/repos/cwfitzgerald/openbve2/stargazers","contributors_url":"https://api.github.com/repos/cwfitzgerald/openbve2/contributors","subscribers_url":"https://api.github.com/repos/cwfitzgerald/openbve2/subscribers","subscription_url":"https://api.github.com/repos/cwfitzgerald/openbve2/subscription","commits_url":"https://api.github.com/repos/cwfitzgerald/openbve2/commits{/sha}","git_commits_url":"https://api.github.com/repos/cwfitzgerald/openbve2/git/commits{/sha}","comments_url":"https://api.github.com/repos/cwfitzgerald/openbve2/comments{/number}","issue_comment_url":"https://api.github.com/repos/cwfitzgerald/openbve2/issues/comments{/number}","contents_url":"https://api.github.com/repos/cwfitzgerald/openbve2/contents/{+path}","compare_url":"https://api.github.com/repos/cwfitzgerald/openbve2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cwfitzgerald/openbve2/merges","archive_url":"https://api.github.com/repos/cwfitzgerald/openbve2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cwfitzgerald/openbve2/downloads","issues_url":"https://api.github.com/repos/cwfitzgerald/openbve2/issues{/number}","pulls_url":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls{/number}","milestones_url":"https://api.github.com/repos/cwfitzgerald/openbve2/milestones{/number}","notifications_url":"https://api.github.com/repos/cwfitzgerald/openbve2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cwfitzgerald/openbve2/labels{/name}","releases_url":"https://api.github.com/repos/cwfitzgerald/openbve2/releases{/id}","deployments_url":"https://api.github.com/repos/cwfitzgerald/openbve2/deployments","created_at":"2017-12-22T01:29:26Z","updated_at":"2018-06-04T16:15:13Z","pushed_at":"2018-06-05T19:03:15Z","git_url":"git://github.com/cwfitzgerald/openbve2.git","ssh_url":"git@github.com:cwfitzgerald/openbve2.git","clone_url":"https://github.com/cwfitzgerald/openbve2.git","svn_url":"https://github.com/cwfitzgerald/openbve2","homepage":null,"size":570,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":6,"license":{"key":"lgpl-2.1","name":"GNU Lesser General Public License v2.1","spdx_id":"LGPL-2.1","url":"https://api.github.com/licenses/lgpl-2.1","node_id":"MDc6TGljZW5zZTEx"},"forks":0,"open_issues":6,"watchers":0,"default_branch":"dev"}},"base":{"label":"cwfitzgerald:dev","ref":"dev","sha":"3ead6946f7f6d8902b7d8858181ca9cd11a8b805","user":{"login":"cwfitzgerald","id":7861353,"node_id":"MDQ6VXNlcjc4NjEzNTM=","avatar_url":"https://avatars2.githubusercontent.com/u/7861353?v=4","gravatar_id":"","url":"https://api.github.com/users/cwfitzgerald","html_url":"https://github.com/cwfitzgerald","followers_url":"https://api.github.com/users/cwfitzgerald/followers","following_url":"https://api.github.com/users/cwfitzgerald/following{/other_user}","gists_url":"https://api.github.com/users/cwfitzgerald/gists{/gist_id}","starred_url":"https://api.github.com/users/cwfitzgerald/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cwfitzgerald/subscriptions","organizations_url":"https://api.github.com/users/cwfitzgerald/orgs","repos_url":"https://api.github.com/users/cwfitzgerald/repos","events_url":"https://api.github.com/users/cwfitzgerald/events{/privacy}","received_events_url":"https://api.github.com/users/cwfitzgerald/received_events","type":"User","site_admin":false},"repo":{"id":115062977,"node_id":"MDEwOlJlcG9zaXRvcnkxMTUwNjI5Nzc=","name":"openbve2","full_name":"cwfitzgerald/openbve2","owner":{"login":"cwfitzgerald","id":7861353,"node_id":"MDQ6VXNlcjc4NjEzNTM=","avatar_url":"https://avatars2.githubusercontent.com/u/7861353?v=4","gravatar_id":"","url":"https://api.github.com/users/cwfitzgerald","html_url":"https://github.com/cwfitzgerald","followers_url":"https://api.github.com/users/cwfitzgerald/followers","following_url":"https://api.github.com/users/cwfitzgerald/following{/other_user}","gists_url":"https://api.github.com/users/cwfitzgerald/gists{/gist_id}","starred_url":"https://api.github.com/users/cwfitzgerald/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cwfitzgerald/subscriptions","organizations_url":"https://api.github.com/users/cwfitzgerald/orgs","repos_url":"https://api.github.com/users/cwfitzgerald/repos","events_url":"https://api.github.com/users/cwfitzgerald/events{/privacy}","received_events_url":"https://api.github.com/users/cwfitzgerald/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/cwfitzgerald/openbve2","description":null,"fork":false,"url":"https://api.github.com/repos/cwfitzgerald/openbve2","forks_url":"https://api.github.com/repos/cwfitzgerald/openbve2/forks","keys_url":"https://api.github.com/repos/cwfitzgerald/openbve2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cwfitzgerald/openbve2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cwfitzgerald/openbve2/teams","hooks_url":"https://api.github.com/repos/cwfitzgerald/openbve2/hooks","issue_events_url":"https://api.github.com/repos/cwfitzgerald/openbve2/issues/events{/number}","events_url":"https://api.github.com/repos/cwfitzgerald/openbve2/events","assignees_url":"https://api.github.com/repos/cwfitzgerald/openbve2/assignees{/user}","branches_url":"https://api.github.com/repos/cwfitzgerald/openbve2/branches{/branch}","tags_url":"https://api.github.com/repos/cwfitzgerald/openbve2/tags","blobs_url":"https://api.github.com/repos/cwfitzgerald/openbve2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cwfitzgerald/openbve2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cwfitzgerald/openbve2/git/refs{/sha}","trees_url":"https://api.github.com/repos/cwfitzgerald/openbve2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cwfitzgerald/openbve2/statuses/{sha}","languages_url":"https://api.github.com/repos/cwfitzgerald/openbve2/languages","stargazers_url":"https://api.github.com/repos/cwfitzgerald/openbve2/stargazers","contributors_url":"https://api.github.com/repos/cwfitzgerald/openbve2/contributors","subscribers_url":"https://api.github.com/repos/cwfitzgerald/openbve2/subscribers","subscription_url":"https://api.github.com/repos/cwfitzgerald/openbve2/subscription","commits_url":"https://api.github.com/repos/cwfitzgerald/openbve2/commits{/sha}","git_commits_url":"https://api.github.com/repos/cwfitzgerald/openbve2/git/commits{/sha}","comments_url":"https://api.github.com/repos/cwfitzgerald/openbve2/comments{/number}","issue_comment_url":"https://api.github.com/repos/cwfitzgerald/openbve2/issues/comments{/number}","contents_url":"https://api.github.com/repos/cwfitzgerald/openbve2/contents/{+path}","compare_url":"https://api.github.com/repos/cwfitzgerald/openbve2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cwfitzgerald/openbve2/merges","archive_url":"https://api.github.com/repos/cwfitzgerald/openbve2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cwfitzgerald/openbve2/downloads","issues_url":"https://api.github.com/repos/cwfitzgerald/openbve2/issues{/number}","pulls_url":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls{/number}","milestones_url":"https://api.github.com/repos/cwfitzgerald/openbve2/milestones{/number}","notifications_url":"https://api.github.com/repos/cwfitzgerald/openbve2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cwfitzgerald/openbve2/labels{/name}","releases_url":"https://api.github.com/repos/cwfitzgerald/openbve2/releases{/id}","deployments_url":"https://api.github.com/repos/cwfitzgerald/openbve2/deployments","created_at":"2017-12-22T01:29:26Z","updated_at":"2018-06-04T16:15:13Z","pushed_at":"2018-06-05T19:03:15Z","git_url":"git://github.com/cwfitzgerald/openbve2.git","ssh_url":"git@github.com:cwfitzgerald/openbve2.git","clone_url":"https://github.com/cwfitzgerald/openbve2.git","svn_url":"https://github.com/cwfitzgerald/openbve2","homepage":null,"size":570,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":6,"license":{"key":"lgpl-2.1","name":"GNU Lesser General Public License v2.1","spdx_id":"LGPL-2.1","url":"https://api.github.com/licenses/lgpl-2.1","node_id":"MDc6TGljZW5zZTEx"},"forks":0,"open_issues":6,"watchers":0,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls/12"},"html":{"href":"https://github.com/cwfitzgerald/openbve2/pull/12"},"issue":{"href":"https://api.github.com/repos/cwfitzgerald/openbve2/issues/12"},"comments":{"href":"https://api.github.com/repos/cwfitzgerald/openbve2/issues/12/comments"},"review_comments":{"href":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls/12/comments"},"review_comment":{"href":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/cwfitzgerald/openbve2/pulls/12/commits"},"statuses":{"href":"https://api.github.com/repos/cwfitzgerald/openbve2/statuses/ba393212de8e54dc97d685957bbd9faf45d6ff77"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"cwfitzgerald"}}