aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKitsune Ral <Kitsune-Ral@users.sf.net>2016-08-31 18:27:43 +0900
committerKitsune Ral <Kitsune-Ral@users.sf.net>2016-08-31 18:27:43 +0900
commit0fe83d59d76cd8f9c8f92d40cc58d9f5b082a84a (patch)
tree2c7d00e479e633c025323512420200dd8679ae9a
parent4004992d8dd55ee27c3d39434d6a4498b8f515ef (diff)
downloadlibquotient-0fe83d59d76cd8f9c8f92d40cc58d9f5b082a84a.tar.gz
libquotient-0fe83d59d76cd8f9c8f92d40cc58d9f5b082a84a.zip
Event::fromJson(): made the code more compact
That might be not as efficient as a solution on variadic templates; but arguably easier to understand.
-rw-r--r--events/event.cpp55
1 files changed, 24 insertions, 31 deletions
diff --git a/events/event.cpp b/events/event.cpp
index d05d666f..1235780d 100644
--- a/events/event.cpp
+++ b/events/event.cpp
@@ -82,40 +82,33 @@ QString Event::originalJson() const
return d->originalJson;
}
+template <typename T>
+Event* make(const QJsonObject& obj)
+{
+ return T::fromJson(obj);
+}
+
Event* Event::fromJson(const QJsonObject& obj)
{
- //qDebug() << obj.value("type").toString();
- if( obj.value("type").toString() == "m.room.message" )
- {
- return RoomMessageEvent::fromJson(obj);
- }
- if( obj.value("type").toString() == "m.room.name" )
- {
- return RoomNameEvent::fromJson(obj);
- }
- if( obj.value("type").toString() == "m.room.aliases" )
- {
- return RoomAliasesEvent::fromJson(obj);
- }
- if( obj.value("type").toString() == "m.room.canonical_alias" )
- {
- return RoomCanonicalAliasEvent::fromJson(obj);
- }
- if( obj.value("type").toString() == "m.room.member" )
- {
- return RoomMemberEvent::fromJson(obj);
- }
- if( obj.value("type").toString() == "m.room.topic" )
- {
- return RoomTopicEvent::fromJson(obj);
- }
- if( obj.value("type").toString() == "m.typing" )
- {
- return TypingEvent::fromJson(obj);
- }
- if( obj.value("type").toString() == "m.receipt" )
+ struct Factory {
+ QString type;
+ Event* (*make)(const QJsonObject& obj);
+ };
+ const Factory evTypes[] {
+ { "m.room.message", make<RoomMessageEvent> },
+ { "m.room.name", make<RoomNameEvent> },
+ { "m.room.aliases", make<RoomAliasesEvent> },
+ { "m.room.canonical_alias", make<RoomCanonicalAliasEvent> },
+ { "m.room.member", make<RoomMemberEvent> },
+ { "m.room.topic", make<RoomTopicEvent> },
+ { "m.room.typing", make<TypingEvent> },
+ { "m.room.receipt", make<ReceiptEvent> },
+ // Insert new types before this line
+ };
+ for (auto e: evTypes)
{
- return ReceiptEvent::fromJson(obj);
+ if (obj["type"].toString() == e.type)
+ return e.make(obj);
}
return UnknownEvent::fromJson(obj);
}