#include #include #include #include #include namespace mbgl { namespace style { namespace conversion { optional setPaintProperties(Layer& layer, const Convertible& value) { auto paintValue = objectMember(value, "paint"); if (!paintValue) { return nullopt; } if (!isObject(*paintValue)) { return { { "paint must be an object" } }; } return eachMember(*paintValue, [&] (const std::string& k, const Convertible& v) { return layer.setPaintProperty(k, v); }); } optional> Converter>::operator()(const Convertible& value, Error& error) const { if (!isObject(value)) { error.message = "layer must be an object"; return nullopt; } auto idValue = objectMember(value, "id"); if (!idValue) { error.message = "layer must have an id"; return nullopt; } optional id = toString(*idValue); if (!id) { error.message = "layer id must be a string"; return nullopt; } auto typeValue = objectMember(value, "type"); if (!typeValue) { error.message = "layer must have a type"; return nullopt; } optional type = toString(*typeValue); if (!type) { error.message = "layer type must be a string"; return nullopt; } std::unique_ptr layer = LayerManager::get()->createLayer(*type, *id, value, error); if (!layer) { return nullopt; } auto minzoomValue = objectMember(value, "minzoom"); if (minzoomValue) { optional minzoom = toNumber(*minzoomValue); if (!minzoom) { error.message = "minzoom must be numeric"; return nullopt; } layer->setMinZoom(*minzoom); } auto maxzoomValue = objectMember(value, "maxzoom"); if (maxzoomValue) { optional maxzoom = toNumber(*maxzoomValue); if (!maxzoom) { error.message = "maxzoom must be numeric"; return nullopt; } layer->setMaxZoom(*maxzoom); } auto layoutValue = objectMember(value, "layout"); if (layoutValue) { if (!isObject(*layoutValue)) { error.message = "layout must be an object"; return nullopt; } optional error_ = eachMember(*layoutValue, [&] (const std::string& k, const Convertible& v) { return layer->setLayoutProperty(k, v); }); if (error_) { error = *error_; return nullopt; } } optional error_ = setPaintProperties(*layer, value); if (error_) { error = *error_; return nullopt; } return std::move(layer); } } // namespace conversion } // namespace style } // namespace mbgl