From b79f67919e05698a8c3daffbe0fe53fa1ce46e54 Mon Sep 17 00:00:00 2001 From: Alexey Rusakov Date: Sun, 8 May 2022 17:43:08 +0200 Subject: toSnakeCase and EventContent::SingleKeyValue This is a rework of EventContent::SimpleContent previously defined in simplestateevents.h. Quite a few events (and not only state events) have just a single key-value pair in their content - this structure (which is really just a template wrapper around the value) and the accompanying JsonConverter<> specialisation encapsulate the concept to streamline definition of such events. This commit only has simplestateevents.h using it; further commits will use SingleKeyValue in other places. toSnakeCase is a facility function that converts camelCase used for C++ variables into snake_case used in JSON payloads. Combined with the preprocessor trick that makes a string literal from an identifier, this allows to reduce boilerplate code that repeats the same name for fields in C++ event classes and fields in JSON. SingleKeyValue uses it, and there are other cases for it coming. --- lib/events/single_key_value.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 lib/events/single_key_value.h (limited to 'lib/events/single_key_value.h') diff --git a/lib/events/single_key_value.h b/lib/events/single_key_value.h new file mode 100644 index 00000000..75ca8cd2 --- /dev/null +++ b/lib/events/single_key_value.h @@ -0,0 +1,27 @@ +#pragma once + +#include "converters.h" + +namespace Quotient { + +namespace EventContent { + template + struct SingleKeyValue { + T value; + }; +} // namespace EventContent + +template +struct JsonConverter> { + using content_type = EventContent::SingleKeyValue; + static content_type load(const QJsonValue& jv) + { + return { fromJson(jv.toObject().value(JsonKey)) }; + } + static QJsonObject dump(const content_type& c) + { + return { { JsonKey, toJson(c.value) } }; + } + static inline const auto JsonKey = toSnakeCase(*KeyStr); +}; +} // namespace Quotient -- cgit v1.2.3