#pragma once #include "value.hpp" #include #include #include #include #include #include namespace mbgl { namespace style { namespace conversion { template <> class ConversionTraits { public: static bool isUndefined(const mbgl::android::Value& value) { return value.isNull(); } static bool isArray(const mbgl::android::Value& value) { return value.isArray(); } static bool isObject(const mbgl::android::Value& value) { return value.isObject(); } static std::size_t arrayLength(const mbgl::android::Value& value) { return value.getLength();; } static mbgl::android::Value arrayMember(const mbgl::android::Value& value, std::size_t i) { return value.get(i); } static optional objectMember(const mbgl::android::Value& value, const char* key) { mbgl::android::Value member = value.get(key); if (!member.isNull()) { return member; } else { return {}; } } template static optional eachMember(const mbgl::android::Value&, Fn&&) { // TODO mbgl::Log::Warning(mbgl::Event::Android, "eachMember not implemented"); return {}; } static optional toBool(const mbgl::android::Value& value) { if (value.isBool()) { return value.toBool(); } else { return {}; } } static optional toNumber(const mbgl::android::Value& value) { if (value.isNumber()) { auto num = value.toFloat(); return num; } else { return {}; } } static optional toDouble(const mbgl::android::Value& value) { if (value.isNumber()) { return value.toDouble(); } else { return {}; } } static optional toString(const mbgl::android::Value& value) { if (value.isString()) { return value.toString(); } else { return {}; } } static optional toValue(const mbgl::android::Value& value) { if (value.isNull()) { return {}; } else if (value.isBool()) { return { value.toBool() }; } else if (value.isString()) { return { value.toString() }; } else if (value.isNumber()) { auto doubleVal = value.toDouble(); return { doubleVal - (int) doubleVal > 0.0 ? doubleVal : value.toLong() }; } else { return {}; } } static optional toGeoJSON(const mbgl::android::Value &value, Error &error) { if (value.isNull() || !value.isString()) { error = { "no json data found" }; return {}; } return parseGeoJSON(value.toString(), error); } }; template optional convert(mbgl::android::Value&& value, Error& error, Args&&...args) { return convert(Convertible(std::move(value)), error, std::forward(args)...); } } // namespace conversion } // namespace style } // namespace mbgl