From df3b44531e1c2a95edd2a035d3744f34ebb8d0e9 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 23 Aug 2016 14:57:55 +0200 Subject: [core] #6071 - extract GeoJSONOptions conversion from GeoJSONSource conversion * [core] geojson_options - retain original error message * [core] tests - initial style conversion stub methods * [core] geojsonoptions conversion - initial unit tests * [core] tests - fix forward reference issue * [core] geojsonoptions conversion - unit tests * [core] geojsonoptions conversion - renamed Holder to Value --- include/mbgl/style/conversion/geojson_options.hpp | 78 +++++++++++++++++++++++ include/mbgl/style/conversion/source.hpp | 60 ++--------------- 2 files changed, 83 insertions(+), 55 deletions(-) create mode 100644 include/mbgl/style/conversion/geojson_options.hpp (limited to 'include/mbgl/style/conversion') diff --git a/include/mbgl/style/conversion/geojson_options.hpp b/include/mbgl/style/conversion/geojson_options.hpp new file mode 100644 index 0000000000..880090b402 --- /dev/null +++ b/include/mbgl/style/conversion/geojson_options.hpp @@ -0,0 +1,78 @@ +#pragma once + +#include +#include + +namespace mbgl { +namespace style { +namespace conversion { + +template <> +struct Converter { + + template + Result operator()(const V& value) const { + GeoJSONOptions options; + + const auto maxzoomValue = objectMember(value, "maxzoom"); + if (maxzoomValue) { + if (toNumber(*maxzoomValue)) { + options.maxzoom = static_cast(*toNumber(*maxzoomValue)); + } else { + return Error{ "GeoJSON source maxzoom value must be a number" }; + } + } + + const auto bufferValue = objectMember(value, "buffer"); + if (bufferValue) { + if (toNumber(*bufferValue)) { + options.buffer = static_cast(*toNumber(*bufferValue)); + } else { + return Error{ "GeoJSON source buffer value must be a number" }; + } + } + + const auto toleranceValue = objectMember(value, "tolerance"); + if (toleranceValue) { + if (toNumber(*toleranceValue)) { + options.tolerance = static_cast(*toNumber(*toleranceValue)); + } else { + return Error{ "GeoJSON source tolerance value must be a number" }; + } + } + + const auto clusterValue = objectMember(value, "cluster"); + if (clusterValue) { + if (toBool(*clusterValue)) { + options.cluster = *toBool(*clusterValue); + } else { + return Error{ "GeoJSON source cluster value must be a boolean" }; + } + } + + const auto clusterMaxZoomValue = objectMember(value, "clusterMaxZoom"); + if (clusterMaxZoomValue) { + if (toNumber(*clusterMaxZoomValue)) { + options.clusterMaxZoom = static_cast(*toNumber(*clusterMaxZoomValue)); + } else { + return Error{ "GeoJSON source clusterMaxZoom value must be a number" }; + } + } + + const auto clusterRadiusValue = objectMember(value, "clusterRadius"); + if (clusterRadiusValue) { + if (toNumber(*clusterRadiusValue)) { + options.clusterRadius = static_cast(*toNumber(*clusterRadiusValue)); + } else { + return Error{ "GeoJSON source clusterRadius value must be a number" }; + } + } + + return { options }; + } + +}; + +} // namespace conversion +} // namespace style +} // namespace mbgl diff --git a/include/mbgl/style/conversion/source.hpp b/include/mbgl/style/conversion/source.hpp index c4b2fe303f..6e1b4347c3 100644 --- a/include/mbgl/style/conversion/source.hpp +++ b/include/mbgl/style/conversion/source.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -103,63 +104,12 @@ private: return Error{ "GeoJSON source must have a data value" }; } - GeoJSONOptions options; - - const auto maxzoomValue = objectMember(value, "maxzoom"); - if (maxzoomValue) { - if (toNumber(*maxzoomValue)) { - options.maxzoom = static_cast(*toNumber(*maxzoomValue)); - } else { - return Error{ "GeoJSON source maxzoom value must be a number" }; - } - } - - const auto bufferValue = objectMember(value, "buffer"); - if (bufferValue) { - if (toNumber(*bufferValue)) { - options.buffer = static_cast(*toNumber(*bufferValue)); - } else { - return Error{ "GeoJSON source buffer value must be a number" }; - } - } - - const auto toleranceValue = objectMember(value, "tolerance"); - if (toleranceValue) { - if (toNumber(*toleranceValue)) { - options.tolerance = static_cast(*toNumber(*toleranceValue)); - } else { - return Error{ "GeoJSON source tolerance value must be a number" }; - } - } - - const auto clusterValue = objectMember(value, "cluster"); - if (clusterValue) { - if (toBool(*clusterValue)) { - options.cluster = *toBool(*clusterValue); - } else { - return Error{ "GeoJSON source cluster value must be a boolean" }; - } - } - - const auto clusterMaxZoomValue = objectMember(value, "clusterMaxZoom"); - if (clusterMaxZoomValue) { - if (toNumber(*clusterMaxZoomValue)) { - options.clusterMaxZoom = static_cast(*toNumber(*clusterMaxZoomValue)); - } else { - return Error{ "GeoJSON source clusterMaxZoom value must be a number" }; - } - } - - const auto clusterRadiusValue = objectMember(value, "clusterRadius"); - if (clusterRadiusValue) { - if (toNumber(*clusterRadiusValue)) { - options.clusterRadius = static_cast(*toNumber(*clusterRadiusValue)); - } else { - return Error{ "GeoJSON source clusterRadius value must be a number" }; - } + Result options = convert(value); + if (!options) { + return options.error(); } - auto result = std::make_unique(id, options); + auto result = std::make_unique(id, *options); if (isObject(*dataValue)) { Result geoJSON = convertGeoJSON(*dataValue); -- cgit v1.2.1