summaryrefslogtreecommitdiff
path: root/include/mbgl/style/conversion/light.hpp
blob: 631ed04ccb461c74ef8600aca021c52b3e434c13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#pragma once

#include <mbgl/style/light.hpp>
#include <mbgl/style/conversion.hpp>
#include <mbgl/style/conversion/position.hpp>
#include <mbgl/style/conversion/property_value.hpp>
#include <mbgl/style/conversion/transition_options.hpp>

namespace mbgl {
namespace style {
namespace conversion {

template <>
struct Converter<Light> {
public:
    template <class V>
    optional<Light> operator()(const V& value, Error& error) const {
        if (!isObject(value)) {
            error = { "light must be an object" };
            return {};
        }

        Light light;

        const auto anchor = objectMember(value, "anchor");
        if (anchor) {
            optional<PropertyValue<LightAnchorType>> convertedAnchor =
                convert<PropertyValue<LightAnchorType>>(*anchor, error);

            if (convertedAnchor) {
                light.get<LightAnchor>().value = *convertedAnchor;
            } else {
                return {};
            }
        }

        const auto anchorTransition = objectMember(value, "anchor-transition");
        if (anchorTransition) {
            optional<TransitionOptions> transition =
                convert<TransitionOptions>(*anchorTransition, error);
            if (transition) {
                light.get<LightAnchor>().transition = *transition;
            } else {
                return {};
            }
        }

        const auto color = objectMember(value, "color");
        if (color) {
            optional<PropertyValue<Color>> convertedColor =
                convert<PropertyValue<Color>>(*color, error);

            if (convertedColor) {
                light.get<LightColor>().value = *convertedColor;
            } else {
                return {};
            }
        }

        const auto colorTransition = objectMember(value, "color-transition");
        if (colorTransition) {
            optional<TransitionOptions> transition =
                convert<TransitionOptions>(*colorTransition, error);
            if (transition) {
                light.get<LightColor>().transition = *transition;
            } else {
                return {};
            }
        }

        const auto position = objectMember(value, "position");
        if (position) {
            optional<PropertyValue<Position>> convertedPosition =
                convert<PropertyValue<Position>>(*position, error);

            if (convertedPosition) {
                light.get<LightPosition>().value = *convertedPosition;
            } else {
                return {};
            }
        }

        const auto positionTransition = objectMember(value, "position-transition");
        if (positionTransition) {
            optional<TransitionOptions> transition =
                convert<TransitionOptions>(*positionTransition, error);
            if (transition) {
                light.get<LightPosition>().transition = *transition;
            } else {
                return {};
            }
        }

        const auto intensity = objectMember(value, "intensity");
        if (intensity) {
            optional<PropertyValue<float>> convertedIntensity =
                convert<PropertyValue<float>>(*intensity, error);

            if (convertedIntensity) {
                light.get<LightIntensity>().value = *convertedIntensity;
            } else {
                return {};
            }
        }

        const auto intensityTransition = objectMember(value, "intensity-transition");
        if (intensityTransition) {
            optional<TransitionOptions> transition =
                convert<TransitionOptions>(*intensityTransition, error);
            if (transition) {
                light.get<LightIntensity>().transition = *transition;
            } else {
                return {};
            }
        }
        return { light };
    };
};

} // namespace conversion
} // namespace style
} // namespace mbgl