// Copyright (C) 2020 Alexis Jeandet. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include #include #include #include #include #include namespace MesonProjectManager { namespace Internal { template inline T load(QJsonDocument &&doc); template<> inline QJsonArray load(QJsonDocument &&doc) { return doc.array(); } template<> inline QJsonObject load(QJsonDocument &&doc) { return doc.object(); } template inline T load(const QJsonValueRef &ref); template<> inline QJsonArray load(const QJsonValueRef &ref) { return ref.toArray(); } template<> inline QJsonObject load(const QJsonValueRef &ref) { return ref.toObject(); } template inline std::optional load(const QString &jsonFile) { QFile js(jsonFile); js.open(QIODevice::ReadOnly | QIODevice::Text); if (js.isOpen()) { auto data = js.readAll(); return load(QJsonDocument::fromJson(data)); } return std::nullopt; } template inline std::optional get(const QJsonObject &obj, const QString &name); template<> inline std::optional get(const QJsonObject &obj, const QString &name) { if (obj.contains(name)) { auto child = obj[name]; if (child.isArray()) return child.toArray(); } return std::nullopt; } template<> inline std::optional get(const QJsonObject &obj, const QString &name) { if (obj.contains(name)) { auto child = obj[name]; if (child.isObject()) return child.toObject(); } return std::nullopt; } template inline std::optional get(const QJsonObject &obj, const QString &firstPath, const Strings &...path) { if (obj.contains(firstPath)) return get(obj[firstPath].toObject(), path...); return std::nullopt; } } // namespace Internal } // namespace MesonProjectManager