// SPDX-License-Identifier: LGPL-3.0-or-later /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * nymea-remoteproxy * Tunnel proxy server for the nymea remote access * * Copyright (C) 2013 - 2024, nymea GmbH * Copyright (C) 2024 - 2025, chargebyte austria GmbH * * This file is part of nymea-remoteproxy. * * nymea-remoteproxy is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * nymea-remoteproxy is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with nymea-remoteproxy. If not, see . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #ifndef JSONTYPES_H #define JSONTYPES_H #include #include #include #include #include "tunnelproxy/tunnelproxyserver.h" namespace remoteproxy { #define DECLARE_OBJECT(typeName, jsonName) \ public: \ static QString typeName##Ref() { return QStringLiteral("$ref:") + QStringLiteral(jsonName); if (!s_initialized) { init(); } } \ static QVariantMap typeName##Description() { \ if (!s_initialized) { init(); } \ return s_##typeName; \ } \ private: \ static QVariantMap s_##typeName; \ public: #define DECLARE_TYPE(typeName, enumString, className, enumName) \ public: \ static QString typeName##Ref() { return QStringLiteral("$ref:") + QStringLiteral(enumString); if (!s_initialized) { init(); } } \ static QVariantList typeName() { \ if (!s_initialized) { init(); } \ return s_##typeName; \ } \ static QString typeName##ToString(className::enumName value) { \ if (!s_initialized) { init(); } \ QMetaObject metaObject = className::staticMetaObject; \ int enumIndex = metaObject.indexOfEnumerator(enumString); \ QMetaEnum metaEnum = metaObject.enumerator(enumIndex); \ return metaEnum.valueToKey(metaEnum.value(value)); \ } \ private: \ static QVariantList s_##typeName; \ public: class JsonTypes { Q_GADGET public: enum BasicType { Uuid, String, Int, UInt, Double, Bool, Variant, Object }; Q_ENUM(BasicType) static QVariantMap allTypes(); // Declare types DECLARE_TYPE(basicType, "BasicType", JsonTypes, BasicType) DECLARE_TYPE(tunnelProxyError, "TunnelProxyError", TunnelProxyServer, TunnelProxyError) // Declare objects // Pack methods // Validation methods static QPair validateMap(const QVariantMap &templateMap, const QVariantMap &map); static QPair validateVariant(const QVariant &templateVariant, const QVariant &variant); static QPair validateEnum(const QVariantList &enumList, const QVariant &value); static QPair validateProperty(const QVariant &templateValue, const QVariant &value); static QPair validateList(const QVariantList &templateList, const QVariantList &list); static QPair validateBasicType(const QVariant &variant); // Converter static QString basicTypeToString(const QVariant::Type &type); private: static bool s_initialized; static QString s_lastError; static void init(); static QPair report(bool status, const QString &message); static QVariantList enumToStrings(const QMetaObject &metaObject, const QString &enumName); }; } #endif // JSONTYPES_H