aboutsummaryrefslogtreecommitdiff
path: root/lib/events/eventloader.h
blob: 4c639efa9d707adbad945adb208b315e5115322e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// SPDX-FileCopyrightText: 2018 Kitsune Ral <kitsune-ral@users.sf.net>
// SPDX-License-Identifier: LGPL-2.1-or-later

#pragma once

#include "stateevent.h"

namespace Quotient {

/*! Create an event with proper type from a JSON object
 *
 * Use this factory template to detect the type from the JSON object
 * contents (the detected event type should derive from the template
 * parameter type) and create an event object of that type.
 */
template <typename BaseEventT>
inline event_ptr_tt<BaseEventT> loadEvent(const QJsonObject& fullJson)
{
    return doLoadEvent<BaseEventT>(fullJson, fullJson[TypeKeyL].toString());
}

//! \brief Create an event from a type string and content JSON
//!
//! Use this template to resolve the C++ type from the Matrix type string in
//! \p matrixType and create an event of that type by passing all parameters
//! to BaseEventT::basicJson().
template <typename BaseEventT, typename... BasicJsonParamTs>
inline event_ptr_tt<BaseEventT> loadEvent(
    const QString& matrixType, const BasicJsonParamTs&... basicJsonParams)
{
    return doLoadEvent<BaseEventT>(
        BaseEventT::basicJson(matrixType, basicJsonParams...), matrixType);
}

template <typename EventT>
struct JsonConverter<event_ptr_tt<EventT>>
    : JsonObjectUnpacker<event_ptr_tt<EventT>> {
    using JsonObjectUnpacker<event_ptr_tt<EventT>>::load;
    static auto load(const QJsonObject& jo)
    {
        return loadEvent<EventT>(jo);
    }
};

} // namespace Quotient