diff options
Diffstat (limited to 'src/mbgl/util')
-rw-r--r-- | src/mbgl/util/rapidjson.cpp | 12 | ||||
-rw-r--r-- | src/mbgl/util/rapidjson.hpp | 4 |
2 files changed, 12 insertions, 4 deletions
diff --git a/src/mbgl/util/rapidjson.cpp b/src/mbgl/util/rapidjson.cpp index 32a3c0b929..0504f8c002 100644 --- a/src/mbgl/util/rapidjson.cpp +++ b/src/mbgl/util/rapidjson.cpp @@ -1,11 +1,17 @@ #include <mbgl/util/rapidjson.hpp> #include <mbgl/util/string.hpp> +#include <algorithm> + namespace mbgl { -std::string formatJSONParseError(const JSDocument& doc) { - return std::string{ rapidjson::GetParseError_En(doc.GetParseError()) } + " at offset " + - util::toString(doc.GetErrorOffset()); +std::string formatJSONParseError(const std::string& json, const JSDocument& doc) { + const size_t offset = std::min(doc.GetErrorOffset(), json.length()); + const size_t lastBreak = json.find_last_of('\n', offset); + const size_t col = offset - (lastBreak == std::string::npos ? 0 : lastBreak); + const size_t line = lastBreak == std::string::npos ? 1 : std::count(json.data(), json.data() + lastBreak, '\n') + 2; + return "on line " + util::toString(line) + " col " + util::toString(col) + ": " + + rapidjson::GetParseError_En(doc.GetParseError()); } } // namespace mbgl diff --git a/src/mbgl/util/rapidjson.hpp b/src/mbgl/util/rapidjson.hpp index 2fb2a07c9f..8c8d576cfa 100644 --- a/src/mbgl/util/rapidjson.hpp +++ b/src/mbgl/util/rapidjson.hpp @@ -3,11 +3,13 @@ #include <rapidjson/document.h> #include <rapidjson/error/en.h> +#include <string> + namespace mbgl { using JSDocument = rapidjson::GenericDocument<rapidjson::UTF8<>, rapidjson::CrtAllocator>; using JSValue = rapidjson::GenericValue<rapidjson::UTF8<>, rapidjson::CrtAllocator>; -std::string formatJSONParseError(const JSDocument&); +std::string formatJSONParseError(const std::string&, const JSDocument&); } // namespace mbgl |