1 | #pragma once |
---|---|
2 | |
3 | #include <mbgl/style/property_value.hpp> |
4 | #include <mbgl/style/conversion.hpp> |
5 | #include <mbgl/style/conversion/constant.hpp> |
6 | #include <mbgl/style/conversion/function.hpp> |
7 | #include <mbgl/style/expression/value.hpp> |
8 | #include <mbgl/style/expression/is_constant.hpp> |
9 | #include <mbgl/style/expression/is_expression.hpp> |
10 | #include <mbgl/style/expression/parsing_context.hpp> |
11 | #include <mbgl/style/expression/literal.hpp> |
12 | |
13 | namespace mbgl { |
14 | namespace style { |
15 | namespace conversion { |
16 | |
17 | template <class T> |
18 | struct Converter<PropertyValue<T>> { |
19 | optional<PropertyValue<T>> operator()(const Convertible& value, Error& error, bool convertTokens = false) const { |
20 | using namespace mbgl::style::expression; |
21 | |
22 | // Only icon-image and text-field support tokens, and they are both data-driven. |
23 | assert(!convertTokens); |
24 | (void)convertTokens; |
25 | |
26 | if (isUndefined(v: value)) { |
27 | return PropertyValue<T>(); |
28 | } |
29 | |
30 | optional<PropertyExpression<T>> expression; |
31 | |
32 | if (isExpression(value)) { |
33 | ParsingContext ctx(valueTypeToExpressionType<T>()); |
34 | ParseResult parsed = ctx.parseLayerPropertyExpression(value); |
35 | if (!parsed) { |
36 | error = { .message: ctx.getCombinedErrors() }; |
37 | return {}; |
38 | } |
39 | expression = PropertyExpression<T>(std::move(*parsed)); |
40 | } else if (isObject(v: value)) { |
41 | expression = convertFunctionToExpression<T>(value, error, false); |
42 | } else { |
43 | optional<T> constant = convert<T>(value, error); |
44 | if (!constant) { |
45 | return {}; |
46 | } |
47 | return { *constant }; |
48 | } |
49 | |
50 | if (!expression) { |
51 | return {}; |
52 | } else if (!(*expression).isFeatureConstant()) { |
53 | error = { .message: "data expressions not supported"}; |
54 | return {}; |
55 | } else if (!(*expression).isZoomConstant()) { |
56 | return { std::move(*expression) }; |
57 | } else if ((*expression).getExpression().getKind() == Kind::Literal) { |
58 | optional<T> constant = fromExpressionValue<T>( |
59 | static_cast<const Literal&>((*expression).getExpression()).getValue()); |
60 | if (!constant) { |
61 | return {}; |
62 | } |
63 | return PropertyValue<T>(*constant); |
64 | } else { |
65 | assert(false); |
66 | error = { .message: "expected a literal expression"}; |
67 | return {}; |
68 | } |
69 | } |
70 | }; |
71 | |
72 | } // namespace conversion |
73 | } // namespace style |
74 | } // namespace mbgl |
75 |