#pragma once #include #include namespace mbgl { namespace style { namespace conversion { template <> struct Converter { public: template optional operator()(const V& value, Error& error) const { Tileset result; auto tiles = objectMember(value, "tiles"); if (!tiles) { error = { "source must have tiles" }; return {}; } if (!isArray(*tiles)) { error = { "source tiles must be an array" }; return {}; } for (std::size_t i = 0; i < arrayLength(*tiles); i++) { optional urlTemplate = toString(arrayMember(*tiles, i)); if (!urlTemplate) { error = { "source tiles member must be a string" }; return {}; } result.tiles.push_back(std::move(*urlTemplate)); } auto schemeValue = objectMember(value, "scheme"); if (schemeValue) { optional scheme = toString(*schemeValue); if (scheme && *scheme == "tms") { result.scheme = Tileset::Scheme::TMS; } } auto minzoomValue = objectMember(value, "minzoom"); if (minzoomValue) { optional minzoom = toNumber(*minzoomValue); if (!minzoom || *minzoom < 0 || *minzoom > std::numeric_limits::max()) { error = { "invalid minzoom" }; return {}; } result.zoomRange.min = *minzoom; } auto maxzoomValue = objectMember(value, "maxzoom"); if (maxzoomValue) { optional maxzoom = toNumber(*maxzoomValue); if (!maxzoom || *maxzoom < 0 || *maxzoom > std::numeric_limits::max()) { error = { "invalid maxzoom" }; return {}; } result.zoomRange.max = *maxzoom; } auto attributionValue = objectMember(value, "attribution"); if (attributionValue) { optional attribution = toString(*attributionValue); if (!attribution) { error = { "source attribution must be a string" }; return {}; } result.attribution = std::move(*attribution); } return result; } }; } // namespace conversion } // namespace style } // namespace mbgl