76inline std::optional<JsonEnvelope>
validateJsonEnvelope(
const QString& filePath,
const QLoggingCategory& category)
86 QFileInfo info(filePath);
103 if (info.exists() && !info.isFile()) {
104 qCWarning(category) <<
"Skipping non-regular file" << filePath;
108 qCWarning(category).nospace() <<
"Skipping " << filePath <<
": file size " << info.size() <<
" exceeds limit "
113 QFile file(filePath);
114 if (!file.open(QIODevice::ReadOnly)) {
115 qCWarning(category) <<
"Skipping unreadable file" << filePath <<
":" << file.errorString();
124 qCWarning(category).nospace() <<
"Skipping " << filePath <<
": file size " << file.size() <<
" exceeds limit "
129 QJsonParseError parseError;
130 const QJsonDocument doc = QJsonDocument::fromJson(file.readAll(), &parseError);
131 if (parseError.error != QJsonParseError::NoError) {
132 qCWarning(category) <<
"Skipping malformed JSON" << filePath <<
":" << parseError.errorString();
135 if (!doc.isObject()) {
136 qCWarning(category) <<
"Skipping non-object root JSON in" << filePath;
140 QJsonObject root = doc.object();
142 const QString name = root.value(QLatin1String(
"name")).toString();
143 if (name.isEmpty()) {
144 qCWarning(category) <<
"Skipping" << filePath <<
": missing required 'name' field";
157 const QString basename = info.completeBaseName();
158 if (name != basename) {
159 qCWarning(category).nospace() <<
"Skipping " << filePath <<
": name '" << name <<
"' does not match filename '"
160 << basename <<
"' — rejecting to avoid silent shadowing";
168 root.remove(QLatin1String(
"name"));
std::optional< JsonEnvelope > validateJsonEnvelope(const QString &filePath, const QLoggingCategory &category)
Validate the default envelope used by DirectoryLoader sinks.
Definition JsonEnvelopeValidator.h:76