#pragma once #include #include #include namespace mbgl { namespace style { namespace conversion { inline bool isUndefined(const JSValue& value) { return value.IsNull(); } inline bool isArray(const JSValue& value) { return value.IsArray(); } inline std::size_t arrayLength(const JSValue& value) { return value.Size(); } inline const JSValue& arrayMember(const JSValue& value, std::size_t i) { return value[rapidjson::SizeType(i)]; } inline bool isObject(const JSValue& value) { return value.IsObject(); } inline const JSValue* objectMember(const JSValue& value, const char * name) { if (!value.HasMember(name)) { return nullptr; } return &value[name]; } template optional eachMember(const JSValue& value, Fn&& fn) { for (auto it = value.MemberBegin(); it != value.MemberEnd(); ++it) { optional result = fn({it->name.GetString(), it->name.GetStringLength()}, it->value); if (result) { return result; } } return {}; } inline optional toBool(const JSValue& value) { if (!value.IsBool()) { return {}; } return value.GetBool(); } inline optional toNumber(const JSValue& value) { if (!value.IsNumber()) { return {}; } return value.GetDouble(); } inline optional toString(const JSValue& value) { if (!value.IsString()) { return {}; } return {{ value.GetString(), value.GetStringLength() }}; } inline optional toValue(const JSValue& value) { switch (value.GetType()) { case rapidjson::kNullType: case rapidjson::kFalseType: return { false }; case rapidjson::kTrueType: return { true }; case rapidjson::kStringType: return { std::string { value.GetString(), value.GetStringLength() } }; case rapidjson::kNumberType: if (value.IsUint64()) return { value.GetUint64() }; if (value.IsInt64()) return { value.GetInt64() }; return { value.GetDouble() }; default: return {}; } } } // namespace conversion } // namespace style } // namespace mbgl