#ifndef JSONHANDLER_H #define JSONHANDLER_H #include #include #include #include "jsonreply.h" class JsonHandler : public QObject { Q_OBJECT public: enum BasicType { Uuid, String, StringList, Int, Uint, Double, Bool, Variant, Color, Time, Object }; Q_ENUM(BasicType) explicit JsonHandler(QObject *parent = nullptr); virtual ~JsonHandler() = default; virtual QString name() const = 0; QVariantMap jsonEnums() const; QVariantMap jsonObjects() const; QVariantMap jsonMethods() const; QVariantMap jsonNotifications() const; template static QString enumRef(); static QString objectRef(const QString &objectName); template static QString enumValueName(T value); template static T enumNameToValue(const QString &name); static BasicType variantTypeToBasicType(QVariant::Type variantType); static QVariant::Type basicTypeToVariantType(BasicType basicType); protected: template void registerEnum(); void registerObject(const QString &name, const QVariantMap &object); void registerMethod(const QString &name, const QString &description, const QVariantMap ¶ms, const QVariantMap &returns, bool deprecated = false); void registerNotification(const QString &name, const QString &description, const QVariantMap ¶ms, bool deprecated = false); JsonReply *createReply(const QVariantMap &data) const; JsonReply *createAsyncReply(const QString &method) const; private: QVariantMap m_enums; QVariantMap m_objects; QVariantMap m_methods; QVariantMap m_notifications; }; template void JsonHandler::registerEnum() { QMetaEnum metaEnum = QMetaEnum::fromType(); QStringList values; for (int i = 0; i < metaEnum.keyCount(); i++) { values << metaEnum.key(i); } m_enums.insert(metaEnum.name(), values); } template QString JsonHandler::enumRef() { QMetaEnum metaEnum = QMetaEnum::fromType(); return QString("$ref:%1").arg(metaEnum.name()); } template QString JsonHandler::enumValueName(T value) { QMetaEnum metaEnum = QMetaEnum::fromType(); return metaEnum.valueToKey(value); } template T JsonHandler::enumNameToValue(const QString &name) { QMetaEnum metaEnum = QMetaEnum::fromType(); return static_cast(metaEnum.keyToValue(name.toUtf8())); } #endif // JSONHANDLER_H