Skip to content

Commit

Permalink
Event::fromJson(): made the code more compact
Browse files Browse the repository at this point in the history
That might be not as efficient as a solution on variadic templates; but
arguably easier to understand.
  • Loading branch information
KitsuneRal committed Aug 31, 2016
1 parent 4004992 commit 0fe83d5
Showing 1 changed file with 24 additions and 31 deletions.
55 changes: 24 additions & 31 deletions events/event.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down

0 comments on commit 0fe83d5

Please sign in to comment.