stdoptionalconverter.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "stdoptionalconverter_p.h"
  2. #include "exception.h"
  3. #include <optional>
  4. using namespace QtJsonSerializer;
  5. using namespace QtJsonSerializer::TypeConverters;
  6. // WORKAROUND for now, nullptr is used instead of nullopt, as nullopt_t cannot be registered as metatype
  7. bool StdOptionalConverter::canConvert(int metaTypeId) const
  8. {
  9. const auto extractor = helper()->extractor(metaTypeId);
  10. return extractor && extractor->baseType() == "optional";
  11. }
  12. QList<QCborValue::Type> StdOptionalConverter::allowedCborTypes(int metaTypeId, QCborTag tag) const
  13. {
  14. Q_UNUSED(metaTypeId)
  15. Q_UNUSED(tag)
  16. QList<QCborValue::Type> types;
  17. const auto metaEnum = QMetaEnum::fromType<QCborValue::Type>();
  18. types.reserve(metaEnum.keyCount());
  19. for (auto i = 0; i < metaEnum.keyCount(); ++i) {
  20. if (const auto value = metaEnum.value(i); value != QCborValue::Invalid)
  21. types.append(static_cast<QCborValue::Type>(value));
  22. }
  23. return types;
  24. }
  25. QCborValue StdOptionalConverter::serialize(int propertyType, const QVariant &value) const
  26. {
  27. const auto extractor = helper()->extractor(propertyType);
  28. if (!extractor) {
  29. throw SerializationException(QByteArray("Failed to get extractor for type ") +
  30. QMetaTypeName(propertyType) +
  31. QByteArray(". Make shure to register std::optional types via QJsonSerializer::registerOptionalConverters"));
  32. }
  33. const auto cValue = extractor->extract(value);
  34. if (cValue.userType() == QMetaType::Nullptr)
  35. return QCborValue::Null;
  36. else
  37. return helper()->serializeSubtype(extractor->subtypes()[0], cValue, "value");
  38. }
  39. QVariant StdOptionalConverter::deserializeCbor(int propertyType, const QCborValue &value, QObject *parent) const
  40. {
  41. const auto extractor = helper()->extractor(propertyType);
  42. if (!extractor) {
  43. throw DeserializationException(QByteArray("Failed to get extractor for type ") +
  44. QMetaTypeName(propertyType) +
  45. QByteArray(". Make shure to register std::optional types via QJsonSerializer::registerOptionalConverters"));
  46. }
  47. QVariant result;
  48. if (value.isNull())
  49. result = QVariant::fromValue(nullptr);
  50. else
  51. result = helper()->deserializeSubtype(extractor->subtypes()[0], value, parent, "value");
  52. extractor->emplace(result, result);
  53. return result;
  54. }