summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnand Thakker <github@anandthakker.net>2017-07-21 15:37:40 -0400
committerAnand Thakker <github@anandthakker.net>2017-08-11 21:54:51 -0400
commit52edbeb1a0a1dd1ba0d7e3e651dcf4d5ea5abe89 (patch)
tree8e921ea34d8f4c0fe27b9f974baecdb134fde7bc
parent09cf58068498e81a9771243db53ab98ba1c9faa2 (diff)
downloadqtlocation-mapboxgl-52edbeb1a0a1dd1ba0d7e3e651dcf4d5ea5abe89.tar.gz
Implement to_{type} coercion expressions
-rw-r--r--include/mbgl/style/expression/expression.hpp9
-rw-r--r--src/mbgl/style/expression/compound_expression.cpp41
2 files changed, 49 insertions, 1 deletions
diff --git a/include/mbgl/style/expression/expression.hpp b/include/mbgl/style/expression/expression.hpp
index ef94ad9cbd..8b2c5c7e98 100644
--- a/include/mbgl/style/expression/expression.hpp
+++ b/include/mbgl/style/expression/expression.hpp
@@ -66,7 +66,13 @@ public:
}
};
-using EvaluationResult = Result<Value>;
+struct EvaluationResult : public Result<Value> {
+ using Result::Result;
+
+ EvaluationResult(const std::array<float, 4>& arr) :
+ Result(std::vector<Value>(arr.begin(), arr.end()))
+ {}
+};
struct CompileError {
std::string message;
@@ -80,6 +86,7 @@ public:
virtual bool isFeatureConstant() const { return true; }
virtual bool isZoomConstant() const { return true; }
+
virtual EvaluationResult evaluate(const EvaluationParameters& params) const = 0;
/*
diff --git a/src/mbgl/style/expression/compound_expression.cpp b/src/mbgl/style/expression/compound_expression.cpp
index 99f0270c1d..189cb0f6a1 100644
--- a/src/mbgl/style/expression/compound_expression.cpp
+++ b/src/mbgl/style/expression/compound_expression.cpp
@@ -119,6 +119,47 @@ std::unordered_map<std::string, CompoundExpression::Definition> CompoundExpressi
define("boolean", assertion<bool>),
define("array", assertion<std::vector<Value>>), // TODO: [array, type, value], [array, type, length, value]
+ define("to_string", [](const Value& v) -> Result<std::string> { return stringify(v); }),
+ define("to_number", [](const Value& v) -> Result<float> {
+ optional<float> result = v.match(
+ [](const float f) -> optional<float> { return f; },
+ [](const std::string& s) -> optional<float> {
+ try {
+ return std::stof(s);
+ } catch(std::exception) {
+ return optional<float>();
+ }
+ },
+ [](const auto&) { return optional<float>(); }
+ );
+ if (!result) {
+ return EvaluationError {
+ "Could not convert " + stringify(v) + " to number."
+ };
+ }
+ return *result;
+ }),
+ define("to_boolean", [](const Value& v) -> Result<bool> {
+ return v.match(
+ [&] (float f) { return (bool)f; },
+ [&] (const std::string& s) { return s.length() > 0; },
+ [&] (bool b) { return b; },
+ [&] (const NullValue&) { return false; },
+ [&] (const auto&) { return true; }
+ );
+ }),
+ define("to_rgba", [](const mbgl::Color& color) -> Result<std::array<float, 4>> {
+ return std::array<float, 4> {{ color.r, color.g, color.b, color.a }};
+ }),
+
+ define("parse_color", [](const std::string& colorString) -> Result<mbgl::Color> {
+ const auto& result = mbgl::Color::parse(colorString);
+ if (result) return *result;
+ return EvaluationError {
+ "Could not parse color from value '" + colorString + "'"
+ };
+ }),
+
std::pair<std::string, Definition>("get", defineGet()),
define("+", [](const Varargs<float>& args) -> Result<float> {