From abd9fd8089f05ecbba71289c5ac71c6731a8670a Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Tue, 24 Sep 2019 23:34:15 +0200 Subject: [PATCH] Improve JSON parse error output --- .../plugininfocompiler.cpp | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/tools/nymea-plugininfocompiler/plugininfocompiler.cpp b/tools/nymea-plugininfocompiler/plugininfocompiler.cpp index c1b8416b..6ffe0e5e 100644 --- a/tools/nymea-plugininfocompiler/plugininfocompiler.cpp +++ b/tools/nymea-plugininfocompiler/plugininfocompiler.cpp @@ -43,19 +43,38 @@ int PluginInfoCompiler::compile(const QString &inputFile, const QString &outputF return 1; } QJsonParseError error; - QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonFile.readAll(), &error); + QByteArray data = jsonFile.readAll(); + QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error); jsonFile.close(); if (error.error != QJsonParseError::NoError) { - qWarning() << "Error parsing input JSON. Aborting."; - qWarning() << "Parser details:" << error.errorString(); + int errorOffset = error.offset; + int newLineIndex = data.indexOf("\n"); + int lineIndex = 1; + while (newLineIndex > 0 && errorOffset > newLineIndex) { + data.remove(0, newLineIndex + 2); + errorOffset -= (newLineIndex + 2); + newLineIndex = data.indexOf("\n"); + lineIndex++; + } + if (newLineIndex >= 0) { + data = data.left(newLineIndex); + } + QString spacer; + for (int i = 0; i < errorOffset; i++) { + spacer += ' '; + } + QDebug dbg = qWarning().nospace().noquote(); + dbg << inputFile << ":" << lineIndex << ":" << errorOffset + 2 << ": error: JSON parsing failed: " << error.errorString() << ": " << data.trimmed() << endl; + dbg << data << endl; + dbg << spacer << "^"; return 1; } QJsonObject jsonObject = QJsonObject::fromVariantMap(jsonDoc.toVariant().toMap()); PluginMetadata metadata(jsonObject); if (!metadata.isValid()) { - qWarning() << "Plugin JSON failed validation. Aborting."; + qWarning().nospace().noquote() << inputFile << ": error: Plugin JSON failed validation. Aborting."; return 2; }