From 8a5bff8ee630673c6ebc496322eab94a41ae9353 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 31 Jan 2017 15:44:18 +0200 Subject: [core] default value support in categorical function conversion --- include/mbgl/style/conversion/function.hpp | 33 ++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) (limited to 'include/mbgl/style/conversion') diff --git a/include/mbgl/style/conversion/function.hpp b/include/mbgl/style/conversion/function.hpp index 90b4b95063..7d69fa55c5 100644 --- a/include/mbgl/style/conversion/function.hpp +++ b/include/mbgl/style/conversion/function.hpp @@ -198,6 +198,21 @@ struct Converter> { } }; +template +Result> convertDefaultValue(const V& value) { + auto defaultValueValue = objectMember(value, "defaultValue"); + if (!defaultValueValue) { + return {}; + } + + auto defaultValue = convert(*defaultValueValue); + if (!defaultValue) { + return Error { "wrong type for \"default\": " + defaultValue.error().message }; + } + + return *defaultValue; +} + template struct Converter> { template @@ -221,7 +236,12 @@ struct Converter> { return stops.error(); } - return SourceFunction(*propertyString, *stops); + auto defaultValue = convertDefaultValue(value); + if (!defaultValue) { + return defaultValue.error(); + } + + return SourceFunction(*propertyString, *stops, *defaultValue); } }; @@ -280,6 +300,11 @@ struct Converter> { return Error { "function property must be a string" }; } + auto defaultValue = convertDefaultValue(value); + if (!defaultValue) { + return defaultValue.error(); + } + std::string type = "exponential"; auto typeValue = objectMember(value, "type"); if (typeValue && toString(*typeValue)) { @@ -305,7 +330,7 @@ struct Converter> { inner.stops.emplace(stop.first.second, stop.second); } - return CompositeFunction(*propertyString, convertedStops); + return CompositeFunction(*propertyString, convertedStops, *defaultValue); } else if (type == "interval") { auto stops = convertStops, T>(value); if (!stops) { @@ -318,7 +343,7 @@ struct Converter> { inner.stops.emplace(stop.first.second, stop.second); } - return CompositeFunction(*propertyString, convertedStops); + return CompositeFunction(*propertyString, convertedStops, *defaultValue); } else if (type == "categorical") { auto stops = convertStops, T>(value); if (!stops) { @@ -331,7 +356,7 @@ struct Converter> { inner.stops.emplace(stop.first.second, stop.second); } - return CompositeFunction(*propertyString, convertedStops); + return CompositeFunction(*propertyString, convertedStops, *defaultValue); } else { return Error { "unsupported function type" }; } -- cgit v1.2.1