From 73ef798bf849a01418895c2e88300e1c6730b665 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 15 Feb 2017 16:17:26 +0100 Subject: PropertyRegistry for runtime information about properties. A first usecase is parsing different property types. --- common/domain/propertyregistry.cpp | 112 +++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 common/domain/propertyregistry.cpp (limited to 'common/domain/propertyregistry.cpp') diff --git a/common/domain/propertyregistry.cpp b/common/domain/propertyregistry.cpp new file mode 100644 index 0000000..2208193 --- /dev/null +++ b/common/domain/propertyregistry.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2017 Christian Mollekopf + * + * This library 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 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library 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 this library. If not, see . + */ +#include "propertyregistry.h" + +#include + +namespace Sink { +namespace Private { + +template +QVariant parseString(const QString &); + +template <> +QVariant parseString(const QString &s) +{ + return QVariant::fromValue(s); +} + +template <> +QVariant parseString(const QString &s) +{ + return QVariant::fromValue(s.toUtf8()); +} + +template <> +QVariant parseString(const QString &s) +{ + return QVariant::fromValue(Sink::ApplicationDomain::Reference{s.toLatin1()}); +} + +template <> +QVariant parseString(const QString &s) +{ + //TODO copy path + // return QVariant::fromValue(Sink::ApplicationDomain::BLOB{s.toLatin1()}); + Q_ASSERT(false); + return QVariant{}; +} + +template <> +QVariant parseString(const QString &s) +{ + if (s == "true") { + return QVariant::fromValue(true); + } + return QVariant::fromValue(false); +} + +template <> +QVariant parseString>(const QString &s) +{ + auto list = s.split(','); + QList result; + std::transform(list.constBegin(), list.constEnd(), std::back_inserter(result), [] (const QString &s) { return s.toUtf8(); }); + return QVariant::fromValue(result); +} + +template <> +QVariant parseString(const QString &s) +{ + return QVariant::fromValue(QDateTime::fromString(s)); +} + +template <> +QVariant parseString(const QString &s) +{ + Q_ASSERT(false); + return QVariant{}; +} + +template <> +QVariant parseString>(const QString &s) +{ + Q_ASSERT(false); + return QVariant{}; +} + +PropertyRegistry &PropertyRegistry::instance() +{ + static PropertyRegistry instance; + return instance; +} + +QVariant PropertyRegistry::parse(const QByteArray &type, const QByteArray &property, const QString &value) +{ + auto parser = registry[type].properties[property].parser; + if (parser) { + return parser(value); + } + SinkWarningCtx(Sink::Log::Context{"PropertyRegistry"}) << "Couldn't find a parser for " << type << property; + return QVariant{}; +} + + } +} -- cgit v1.2.3