summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/style/conversion/function.cpp17
-rw-r--r--src/mbgl/style/expression/dsl.cpp50
2 files changed, 47 insertions, 20 deletions
diff --git a/src/mbgl/style/conversion/function.cpp b/src/mbgl/style/conversion/function.cpp
index fdf52c36db..179ad0e437 100644
--- a/src/mbgl/style/conversion/function.cpp
+++ b/src/mbgl/style/conversion/function.cpp
@@ -660,6 +660,11 @@ optional<std::unique_ptr<Expression>> convertFunctionToExpression(type::Type typ
}
}
+ optional<std::unique_ptr<Expression>> defaultExpr;
+ if (objectMember(value, "default")) {
+ defaultExpr = convertLiteral(type, *objectMember(value, "default"), err);
+ }
+
if (!objectMember(value, "property")) {
// Camera function.
switch (functionType) {
@@ -688,22 +693,22 @@ optional<std::unique_ptr<Expression>> convertFunctionToExpression(type::Type typ
if (functionType == FunctionType::Identity) {
return type.match(
[&] (const type::StringType&) -> optional<std::unique_ptr<Expression>> {
- return string(get(literal(*property)));
+ return string(get(literal(*property)), std::move(defaultExpr));
},
[&] (const type::NumberType&) -> optional<std::unique_ptr<Expression>> {
- return number(get(literal(*property)));
+ return number(get(literal(*property)), std::move(defaultExpr));
},
[&] (const type::BooleanType&) -> optional<std::unique_ptr<Expression>> {
- return boolean(get(literal(*property)));
+ return boolean(get(literal(*property)), std::move(defaultExpr));
},
[&] (const type::ColorType&) -> optional<std::unique_ptr<Expression>> {
- return toColor(get(literal(*property)));
+ return toColor(get(literal(*property)), std::move(defaultExpr));
},
[&] (const type::Array& array) -> optional<std::unique_ptr<Expression>> {
- return assertion(array, get(literal(*property)));
+ return assertion(array, get(literal(*property)), std::move(defaultExpr));
},
[&] (const type::FormattedType&) -> optional<std::unique_ptr<Expression>> {
- return format(get(literal(*property)));
+ return toFormatted(get(literal(*property)), std::move(defaultExpr));
},
[&] (const auto&) -> optional<std::unique_ptr<Expression>> {
assert(false); // No properties use this type.
diff --git a/src/mbgl/style/expression/dsl.cpp b/src/mbgl/style/expression/dsl.cpp
index b4fd8fa551..d1d8dea799 100644
--- a/src/mbgl/style/expression/dsl.cpp
+++ b/src/mbgl/style/expression/dsl.cpp
@@ -54,32 +54,54 @@ std::unique_ptr<Expression> literal(std::initializer_list<const char *> value) {
return literal(values);
}
-std::unique_ptr<Expression> assertion(type::Type type, std::unique_ptr<Expression> value) {
- return std::make_unique<Assertion>(type, vec(std::move(value)));
+std::unique_ptr<Expression> assertion(type::Type type,
+ std::unique_ptr<Expression> value,
+ optional<std::unique_ptr<Expression>> def) {
+ std::vector<std::unique_ptr<Expression>> v = vec(std::move(value));
+ if (def) {
+ v.push_back(std::move(*def));
+ }
+ return std::make_unique<Assertion>(type, std::move(v));
+}
+
+std::unique_ptr<Expression> number(std::unique_ptr<Expression> value,
+ optional<std::unique_ptr<Expression>> def) {
+ return assertion(type::Number, std::move(value), std::move(def));
}
-std::unique_ptr<Expression> number(std::unique_ptr<Expression> value) {
- return assertion(type::Number, std::move(value));
+std::unique_ptr<Expression> string(std::unique_ptr<Expression> value,
+ optional<std::unique_ptr<Expression>> def) {
+ return assertion(type::String, std::move(value), std::move(def));
}
-std::unique_ptr<Expression> string(std::unique_ptr<Expression> value) {
- return assertion(type::String, std::move(value));
+std::unique_ptr<Expression> boolean(std::unique_ptr<Expression> value,
+ optional<std::unique_ptr<Expression>> def) {
+ return assertion(type::Boolean, std::move(value), std::move(def));
}
-std::unique_ptr<Expression> boolean(std::unique_ptr<Expression> value) {
- return assertion(type::Boolean, std::move(value));
+std::unique_ptr<Expression> coercion(type::Type type,
+ std::unique_ptr<Expression> value,
+ optional<std::unique_ptr<Expression>> def) {
+ std::vector<std::unique_ptr<Expression>> v = vec(std::move(value));
+ if (def) {
+ v.push_back(std::move(*def));
+ }
+ return std::make_unique<Coercion>(type, std::move(v));
}
-std::unique_ptr<Expression> toColor(std::unique_ptr<Expression> value) {
- return std::make_unique<Coercion>(type::Color, vec(std::move(value)));
+std::unique_ptr<Expression> toColor(std::unique_ptr<Expression> value,
+ optional<std::unique_ptr<Expression>> def) {
+ return coercion(type::Color, std::move(value), std::move(def));
}
-std::unique_ptr<Expression> toString(std::unique_ptr<Expression> value) {
- return std::make_unique<Coercion>(type::String, vec(std::move(value)));
+std::unique_ptr<Expression> toString(std::unique_ptr<Expression> value,
+ optional<std::unique_ptr<Expression>> def) {
+ return coercion(type::String, std::move(value), std::move(def));
}
-std::unique_ptr<Expression> toFormatted(std::unique_ptr<Expression> value) {
- return std::make_unique<Coercion>(type::Formatted, vec(std::move(value)));
+std::unique_ptr<Expression> toFormatted(std::unique_ptr<Expression> value,
+ optional<std::unique_ptr<Expression>> def) {
+ return coercion(type::Formatted, std::move(value), std::move(def));
}
std::unique_ptr<Expression> get(const char* value) {