#include "logos_qt_arg_decode.h" namespace logos { namespace { // One case per QMetaType the Qt type mapping can produce for a parameter. // Each hands off to the SAME QtArgCodec the generated dispatch uses, so the // two provider sites cannot answer differently for the same argument. template QtArgVerdict decodeAs(const QVariant& in, const std::string& path, QVariant& out, std::string& error) { try { out = QVariant::fromValue(detail::QtArgCodec::from(in, path)); return QtArgVerdict::Ok; } catch (const CodecError& e) { error = e.what(); return QtArgVerdict::Rejected; } } } // namespace QtArgVerdict qtArgDecode(const QVariant& in, QMetaType paramType, const std::string& path, QVariant& out, std::string& error) { switch (paramType.id()) { case QMetaType::Bool: return decodeAs(in, path, out, error); case QMetaType::Int: return decodeAs(in, path, out, error); case QMetaType::UInt: return decodeAs(in, path, out, error); case QMetaType::Short: return decodeAs(in, path, out, error); case QMetaType::UShort: return decodeAs(in, path, out, error); case QMetaType::Long: return decodeAs(in, path, out, error); case QMetaType::ULong: return decodeAs(in, path, out, error); case QMetaType::LongLong: return decodeAs(in, path, out, error); case QMetaType::ULongLong: return decodeAs(in, path, out, error); case QMetaType::Double: return decodeAs(in, path, out, error); case QMetaType::Float: return decodeAs(in, path, out, error); case QMetaType::QString: return decodeAs(in, path, out, error); case QMetaType::QByteArray: return decodeAs(in, path, out, error); case QMetaType::QStringList: return decodeAs(in, path, out, error); case QMetaType::QVariantList: return decodeAs(in, path, out, error); case QMetaType::QVariantMap: return decodeAs(in, path, out, error); case QMetaType::QJsonArray: return decodeAs(in, path, out, error); case QMetaType::QJsonObject: return decodeAs(in, path, out, error); // `any`, QUrl, QChar, enums, pointers, LogosResult, anything a module // author invented: no LIDL counterpart, so no rule to check against. The // caller keeps whatever it did before — see the header comment. default: return QtArgVerdict::Unchecked; } } nlohmann::json dispatchFailedJson(const std::string& origin, const std::string& message) { return nlohmann::json{{"code", "dispatch_failed"}, {"message", message}, {"origin", origin}}; } QVariant dispatchFailedVariant(const QString& origin, const QString& message) { QVariantMap m; m.insert(QStringLiteral("code"), QStringLiteral("dispatch_failed")); m.insert(QStringLiteral("message"), message); m.insert(QStringLiteral("origin"), origin); return m; } } // namespace logos