diff options
Diffstat (limited to 'include/mbgl/style/expression/parse.hpp')
-rw-r--r-- | include/mbgl/style/expression/parse.hpp | 111 |
1 files changed, 2 insertions, 109 deletions
diff --git a/include/mbgl/style/expression/parse.hpp b/include/mbgl/style/expression/parse.hpp index 2b5bab7750..ae0d62732b 100644 --- a/include/mbgl/style/expression/parse.hpp +++ b/include/mbgl/style/expression/parse.hpp @@ -1,23 +1,9 @@ #pragma once #include <memory> -#include <mbgl/style/conversion/get_json_type.hpp> -#include <mbgl/style/expression/check_subtype.hpp> +#include <mbgl/style/conversion.hpp> #include <mbgl/style/expression/expression.hpp> -#include <mbgl/style/expression/compound_expression.hpp> - -#include <mbgl/style/expression/parse/at.hpp> -#include <mbgl/style/expression/parse/array_assertion.hpp> -#include <mbgl/style/expression/parse/case.hpp> -#include <mbgl/style/expression/parse/coalesce.hpp> -#include <mbgl/style/expression/parse/compound_expression.hpp> -#include <mbgl/style/expression/parse/curve.hpp> -#include <mbgl/style/expression/parse/in.hpp> -#include <mbgl/style/expression/parse/let.hpp> -#include <mbgl/style/expression/parse/literal.hpp> -#include <mbgl/style/expression/parse/match.hpp> #include <mbgl/style/expression/parsing_context.hpp> -#include <mbgl/style/expression/type.hpp> namespace mbgl { @@ -32,100 +18,7 @@ using namespace mbgl::style; type (either Literal, or the one named in value[0]) and dispatching to the appropriate ParseXxxx::parse(const V&, ParsingContext) method. */ -template <class V> -ParseResult parseExpression(const V& value, ParsingContext context) -{ - using namespace mbgl::style::conversion; - - ParseResult parsed; - - if (isArray(value)) { - const std::size_t length = arrayLength(value); - if (length == 0) { - context.error(R"(Expected an array with at least one element. If you wanted a literal array, use ["literal", []].)"); - return ParseResult(); - } - - const optional<std::string> op = toString(arrayMember(value, 0)); - if (!op) { - context.error( - "Expression name must be a string, but found " + getJSONType(arrayMember(value, 0)) + - R"( instead. If you wanted a literal array, use ["literal", [...]].)", - 0 - ); - return ParseResult(); - } - - if (*op == "literal") { - if (length != 2) { - context.error( - "'literal' expression requires exactly one argument, but found " + std::to_string(length - 1) + " instead." - ); - return ParseResult(); - } - - parsed = ParseLiteral::parse(arrayMember(value, 1), context); - } else if (*op == "match") { - parsed = ParseMatch::parse(value, context); - } else if (*op == "curve") { - parsed = ParseCurve::parse(value, context); - } else if (*op == "coalesce") { - parsed = ParseCoalesce::parse(value, context); - } else if (*op == "case") { - parsed = ParseCase::parse(value, context); - } else if (*op == "array") { - parsed = ParseArrayAssertion::parse(value, context); - } else if (*op == "let") { - parsed = ParseLet::parse(value, context); - } else if (*op == "var") { - parsed = ParseVar::parse(value, context); - } else if (*op == "at") { - parsed = ParseAt::parse(value, context); - } else if (*op == "contains") { - parsed = ParseIn::parse(value, context); - } else { - parsed = ParseCompoundExpression::parse(*op, value, context); - } - } else { - if (isObject(value)) { - context.error(R"(Bare objects invalid. Use ["literal", {...}] instead.)"); - return ParseResult(); - } - - parsed = ParseLiteral::parse(value, context); - } - - if (!parsed) { - assert(context.errors.size() > 0); - } else if (context.expected) { - auto wrapForType = [&](const std::string& wrapper, std::unique_ptr<Expression> expression) { - std::vector<std::unique_ptr<Expression>> args; - args.push_back(std::move(expression)); - return createCompoundExpression(wrapper, std::move(args), context); - }; - - const type::Type actual = (*parsed)->getType(); - const type::Type expected = *context.expected; - if (expected == type::Color && (actual == type::String || actual == type::Value)) { - parsed = wrapForType("to-color", std::move(*parsed)); - } else if (expected != type::Value && actual == type::Value) { - if (expected == type::String) { - parsed = wrapForType("string", std::move(*parsed)); - } else if (expected == type::Number) { - parsed = wrapForType("number", std::move(*parsed)); - } else if (expected == type::Boolean) { - parsed = wrapForType("boolean", std::move(*parsed)); - } - } - - checkSubtype(*(context.expected), (*parsed)->getType(), context); - if (context.errors.size() > 0) { - return ParseResult(); - } - } - - return parsed; -} +ParseResult parseExpression(const mbgl::style::conversion::Value& value, ParsingContext context); } // namespace expression |