void Parser::parse(const std::string& json) { rapidjson::GenericDocument<rapidjson::UTF8<>, rapidjson::CrtAllocator> document; document.Parse<0>(json.c_str()); if (document.HasParseError()) { Log::Error(Event::ParseStyle, "Error parsing style JSON at %i: %s", document.GetErrorOffset(), rapidjson::GetParseError_En(document.GetParseError())); return; } if (!document.IsObject()) { Log::Error(Event::ParseStyle, "Style JSON must be an object"); return; } if (document.HasMember("version")) { const JSValue& versionValue = document["version"]; const int version = versionValue.IsNumber() ? versionValue.GetInt() : 0; if (version != 8) { Log::Warning(Event::ParseStyle, "current renderer implementation only supports style spec version 8; using an outdated style will cause rendering errors"); } } if (document.HasMember("sources")) { parseSources(document["sources"]); } if (document.HasMember("layers")) { parseLayers(document["layers"]); } if (document.HasMember("sprite")) { const JSValue& sprite = document["sprite"]; if (sprite.IsString()) { spriteURL = { sprite.GetString(), sprite.GetStringLength() }; } } if (document.HasMember("glyphs")) { const JSValue& glyphs = document["glyphs"]; if (glyphs.IsString()) { glyphURL = { glyphs.GetString(), glyphs.GetStringLength() }; } } }
void StyleParser::parse(const JSVal& document) { if (document.HasMember("version")) { version = document["version"].GetInt(); if (version != 8) { Log::Warning(Event::ParseStyle, "current renderer implementation only supports style spec version 8; using an outdated style will cause rendering errors"); } } if (document.HasMember("sources")) { parseSources(document["sources"]); } if (document.HasMember("layers")) { parseLayers(document["layers"]); } if (document.HasMember("sprite")) { parseSprite(document["sprite"]); } if (document.HasMember("glyphs")) { parseGlyphURL(document["glyphs"]); } }
StyleParseResult Parser::parse(const std::string& json) { rapidjson::GenericDocument<rapidjson::UTF8<>, rapidjson::CrtAllocator> document; document.Parse<0>(json.c_str()); if (document.HasParseError()) { std::stringstream message; message << document.GetErrorOffset() << " - " << rapidjson::GetParseError_En(document.GetParseError()); return std::make_exception_ptr(std::runtime_error(message.str())); } if (!document.IsObject()) { return std::make_exception_ptr(std::runtime_error("style must be an object")); } if (document.HasMember("version")) { const JSValue& versionValue = document["version"]; const int version = versionValue.IsNumber() ? versionValue.GetInt() : 0; if (version != 8) { Log::Warning(Event::ParseStyle, "current renderer implementation only supports style spec version 8; using an outdated style will cause rendering errors"); } } if (document.HasMember("name")) { const JSValue& value = document["name"]; if (value.IsString()) { name = { value.GetString(), value.GetStringLength() }; } } if (document.HasMember("center")) { const JSValue& value = document["center"]; if (value.IsArray() && value.Size() >= 2) { // Style spec uses lon/lat order latLng.longitude = value[0].IsNumber() ? value[0].GetDouble() : 0; latLng.latitude = value[1].IsNumber() ? value[1].GetDouble() : 0; } } if (document.HasMember("zoom")) { const JSValue& value = document["zoom"]; if (value.IsNumber()) { zoom = value.GetDouble(); } } if (document.HasMember("bearing")) { const JSValue& value = document["bearing"]; if (value.IsNumber()) { bearing = value.GetDouble(); } } if (document.HasMember("pitch")) { const JSValue& value = document["pitch"]; if (value.IsNumber()) { pitch = value.GetDouble(); } } if (document.HasMember("sources")) { parseSources(document["sources"]); } if (document.HasMember("layers")) { parseLayers(document["layers"]); } if (document.HasMember("sprite")) { const JSValue& sprite = document["sprite"]; if (sprite.IsString()) { spriteURL = { sprite.GetString(), sprite.GetStringLength() }; } } if (document.HasMember("glyphs")) { const JSValue& glyphs = document["glyphs"]; if (glyphs.IsString()) { glyphURL = { glyphs.GetString(), glyphs.GetStringLength() }; } } return nullptr; }