summaryrefslogtreecommitdiff
path: root/src/mbgl/style/expression/formatted.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/style/expression/formatted.cpp')
-rw-r--r--src/mbgl/style/expression/formatted.cpp60
1 files changed, 57 insertions, 3 deletions
diff --git a/src/mbgl/style/expression/formatted.cpp b/src/mbgl/style/expression/formatted.cpp
index 6eb106dfec..d38f47b921 100644
--- a/src/mbgl/style/expression/formatted.cpp
+++ b/src/mbgl/style/expression/formatted.cpp
@@ -44,13 +44,67 @@ namespace conversion {
using namespace mbgl::style::expression;
-optional<Formatted> Converter<Formatted>::operator()(const Convertible& value, Error&) const {
+optional<Formatted> Converter<Formatted>::operator()(const Convertible& value, Error& error) const {
using namespace mbgl::style::expression;
- auto result = toString(value);
- if (result) {
+ if (isArray(value)) {
+ std::vector<FormattedSection> sections;
+ for (std::size_t i = 0; i < arrayLength(value); ++i) {
+ Convertible section = arrayMember(value, i);
+ std::size_t sectionLength = arrayLength(section);
+ if (sectionLength < 1) {
+ error.message = "Section has to contain a text and optional parameters.";
+ return nullopt;
+ }
+
+ optional<std::string> sectionText = toString(arrayMember(section, 0));
+ if (!sectionText) {
+ error.message = "Section has to contain a text.";
+ return nullopt;
+ }
+
+ optional<double> fontScale;
+ optional<FontStack> textFont;
+ if (sectionLength > 1) {
+ Convertible sectionParams = arrayMember(section, 1);
+ if (!isObject(sectionParams)) {
+ error.message = "Parameters have to be enclosed in an object.";
+ return nullopt;
+ }
+
+ optional<Convertible> fontScaleMember = objectMember(sectionParams, "font-scale");
+ if (fontScaleMember) {
+ fontScale = toDouble(*fontScaleMember);
+ }
+
+ optional<Convertible> textFontMember = objectMember(sectionParams, "text-font");
+ if (textFontMember) {
+ if (isArray(*textFontMember)) {
+ std::vector<std::string> fontsVector;
+ for (std::size_t j = 0; j < arrayLength(*textFontMember); ++j) {
+ auto font = toString(arrayMember(*textFontMember, j));
+ if (font) {
+ fontsVector.push_back(*font);
+ } else {
+ error.message = "Font has to be a string.";
+ return nullopt;
+ }
+ }
+ textFont = fontsVector;
+ } else {
+ error.message = "Font stack has to be an array.";
+ return nullopt;
+ }
+ }
+ }
+
+ sections.push_back(FormattedSection(*sectionText, fontScale, textFont));
+ }
+ return Formatted(sections);
+ } else if (optional<std::string> result = toString(value)) {
return Formatted(result->c_str());
} else {
+ error.message = "Not supported Formatted type property.";
return nullopt;
}
}