Status deserializeQueryData(const rj::Value& v, QueryDataSet& qd) { if (!v.IsArray()) { return Status(1, "JSON object was not an array"); } for (const auto& i : v.GetArray()) { Row r; auto status = deserializeRow(i, r); if (!status.ok()) { return status; } qd.insert(std::move(r)); } return Status(); }
Status deserializeQueryData(const rj::Value& arr, QueryData& qd) { if (!arr.IsArray()) { return Status(1); } for (const auto& i : arr.GetArray()) { Row r; auto status = deserializeRow(i, r); if (!status.ok()) { return status; } qd.push_back(r); } return Status(); }
// parse coordinate pair from JSON array osmium::geom::Coordinates parse_coordinate(const rapidjson::Value& value) { if (!value.IsArray()) { throw config_error{"Coordinates must be an array."}; } const auto array = value.GetArray(); if (array.Size() != 2) { throw config_error{"Coordinates array must have exactly two elements."}; } if (array[0].IsNumber() && array[1].IsNumber()) { return osmium::geom::Coordinates{array[0].GetDouble(), array[1].GetDouble()}; } throw config_error{"Coordinates array must contain numbers."}; }
void Client::parseExtensions(const rapidjson::Value &value) { if (!value.IsArray()) { return; } for (const rapidjson::Value &ext : value.GetArray()) { if (!ext.IsString()) { continue; } if (strcmp(ext.GetString(), "nicehash") == 0) { m_nicehash = true; } } }
std::vector<osmium::geom::Coordinates> parse_ring(const rapidjson::Value& value) { if (!value.IsArray()) { throw config_error{"Ring must be an array."}; } const auto array = value.GetArray(); if (array.Size() < 3) { throw config_error{"Ring must contain at least three coordinate pairs."}; } std::vector<osmium::geom::Coordinates> coordinates; for (const rapidjson::Value& item : array) { coordinates.push_back(parse_coordinate(item)); } return coordinates; }
std::size_t parse_multipolygon_array(const rapidjson::Value& value, osmium::memory::Buffer& buffer) { assert(value.IsArray()); const auto array = value.GetArray(); if (array.Empty()) { throw config_error{"Multipolygon must contain at least one polygon array."}; } { osmium::builder::AreaBuilder builder{buffer}; for (const auto& polygon : array) { if (!polygon.IsArray()) { throw config_error{"Polygon must be an array."}; } parse_rings(polygon, builder); } } return buffer.commit(); }
void parse_rings(const rapidjson::Value& value, osmium::builder::AreaBuilder& builder) { assert(value.IsArray()); const auto array = value.GetArray(); if (array.Empty()) { throw config_error{"Polygon must contain at least one ring."}; } { const auto outer_ring = parse_ring(array[0]); osmium::builder::OuterRingBuilder ring_builder{builder}; for (const auto& c : outer_ring) { osmium::Location loc{c.x, c.y}; if (loc.valid()) { ring_builder.add_node_ref(0, loc); } else { throw config_error{"Invalid location in boundary (multi)polygon: (" + std::to_string(c.x) + ", " + std::to_string(c.y) + ")."}; } } } for (unsigned int i = 1; i < array.Size(); ++i) { const auto inner_ring = parse_ring(array[i]); osmium::builder::InnerRingBuilder ring_builder{builder}; for (const auto& c : inner_ring) { osmium::Location loc{c.x, c.y}; if (loc.valid()) { ring_builder.add_node_ref(0, loc); } else { throw config_error{"Invalid location in boundary (multi)polygon: (" + std::to_string(c.x) + ", " + std::to_string(c.y) + ")."}; } } } }
void ArchiveStack::loadJson(const rapidjson::Value& lensStack) { for (const auto& metadata : lensStack.GetArray()) { stack_.push_back(ArchiveMetadata::fromJson(metadata)); } }