1 #pragma once
2 
3 #include <mbgl/style/layer.hpp>
4 #include <mbgl/style/layers/symbol_layer.hpp>
5 #include <mbgl/style/conversion.hpp>
6 #include <mbgl/style/conversion/color_ramp_property_value.hpp>
7 #include <mbgl/style/conversion/constant.hpp>
8 #include <mbgl/style/conversion/property_value.hpp>
9 #include <mbgl/style/conversion/data_driven_property_value.hpp>
10 #include <mbgl/style/conversion/transition_options.hpp>
11 
12 #include <string>
13 
14 namespace mbgl {
15 namespace style {
16 namespace conversion {
17 
18 using PropertySetter = optional<Error> (*) (Layer&, const Convertible&);
19 
20 template <class L, class PropertyValue, void (L::*setter)(PropertyValue), bool convertTokens = false>
setProperty(Layer & layer,const Convertible & value)21 optional<Error> setProperty(Layer& layer, const Convertible& value) {
22     auto* typedLayer = layer.as<L>();
23     if (!typedLayer) {
24         return Error { "layer doesn't support this property" };
25     }
26 
27     Error error;
28     optional<PropertyValue> typedValue = convert<PropertyValue>(value, error, convertTokens);
29     if (!typedValue) {
30         return error;
31     }
32 
33     (typedLayer->*setter)(*typedValue);
34     return {};
35 }
36 
37 template <class L, void (L::*setter)(const TransitionOptions&)>
setTransition(Layer & layer,const Convertible & value)38 optional<Error> setTransition(Layer& layer, const Convertible& value) {
39     auto* typedLayer = layer.as<L>();
40     if (!typedLayer) {
41         return Error { "layer doesn't support this property" };
42     }
43 
44     Error error;
45     optional<TransitionOptions> transition = convert<TransitionOptions>(value, error);
46     if (!transition) {
47         return error;
48     }
49 
50     (typedLayer->*setter)(*transition);
51     return {};
52 }
53 
setVisibility(Layer & layer,const Convertible & value)54 inline optional<Error> setVisibility(Layer& layer, const Convertible& value) {
55     if (isUndefined(value)) {
56         layer.setVisibility(VisibilityType::Visible);
57         return {};
58     }
59 
60     Error error;
61     optional<VisibilityType> visibility = convert<VisibilityType>(value, error);
62     if (!visibility) {
63         return error;
64     }
65 
66     layer.setVisibility(*visibility);
67     return {};
68 }
69 
70 } // namespace conversion
71 } // namespace style
72 } // namespace mbgl
73