summaryrefslogtreecommitdiff
path: root/include/mbgl/style/expression/parse/compound_expression.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/mbgl/style/expression/parse/compound_expression.hpp')
-rw-r--r--include/mbgl/style/expression/parse/compound_expression.hpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/include/mbgl/style/expression/parse/compound_expression.hpp b/include/mbgl/style/expression/parse/compound_expression.hpp
new file mode 100644
index 0000000000..248ba4c102
--- /dev/null
+++ b/include/mbgl/style/expression/parse/compound_expression.hpp
@@ -0,0 +1,50 @@
+#pragma once
+
+#include <array>
+#include <vector>
+#include <memory>
+#include <mbgl/style/expression/compound_expression.hpp>
+#include <mbgl/style/expression/type.hpp>
+#include <mbgl/style/expression/value.hpp>
+#include <mbgl/style/expression/parsing_context.hpp>
+#include <mbgl/style/conversion.hpp>
+
+namespace mbgl {
+namespace style {
+namespace expression {
+
+struct ParseCompoundExpression {
+ template <class V>
+ static ParseResult parse(const V& value, ParsingContext ctx) {
+ using namespace mbgl::style::conversion;
+ assert(isArray(value) && arrayLength(value) > 0);
+ const auto& name = toString(arrayMember(value, 0));
+ assert(name);
+
+ auto it = CompoundExpressions::definitions.find(*name);
+ if (it == CompoundExpressions::definitions.end()) {
+ ctx.error(
+ R"(Unknown expression ")" + *name + R"(". If you wanted a literal array, use ["literal", [...]].)",
+ 0
+ );
+ return ParseResult();
+ }
+ const CompoundExpressions::Definition& definition = it->second;
+
+ // parse subexpressions first
+ std::vector<std::unique_ptr<Expression>> args;
+ auto length = arrayLength(value);
+ for (std::size_t i = 1; i < length; i++) {
+ auto parsed = parseExpression(arrayMember(value, i), ParsingContext(ctx, i));
+ if (!parsed) {
+ return parsed;
+ }
+ args.push_back(std::move(*parsed));
+ }
+ return CompoundExpressions::create(*name, definition, std::move(args), ctx);
+ }
+};
+
+} // namespace expression
+} // namespace style
+} // namespace mbgl