package com.applicaster.easytracking.ivw import com.applicaster.easytracking.ivw.Event.Companion.KET_ROOT_EVENTS import com.google.gson.JsonDeserializer import com.google.gson.JsonObject import com.google.gson.annotations.SerializedName data class Events( @SerializedName(KET_ROOT_EVENTS) val values: List ) data class Screen( @SerializedName(KEY_EVENT) val name: String?, @SerializedName(KEY_CODE) val code: String?, @SerializedName(KEY_TRACK_ONCE) val trackOnce: Boolean?): Event() data class Action( @SerializedName(KEY_EVENT) val name: String?, @SerializedName(KEY_CODE) val code: String?, @SerializedName(KEY_FROM_EVENTS) val sourceEventNames: List = listOf()): Event() sealed class Event { companion object { fun createJsonDeserializer(): JsonDeserializer = JsonDeserializer { json, typeOfT, context -> val event = json as JsonObject val name = if (event.has(KEY_EVENT)) event.get(KEY_EVENT).asString else null val code = if (event.has(KEY_CODE)) event.get(KEY_CODE).asString else null return@JsonDeserializer if (event.has(KEY_FROM_EVENTS)) { val sourceEventNamesJson = event.get(KEY_FROM_EVENTS).asJsonArray val sourceEventNames = sourceEventNamesJson.map {element -> element.asString } Action( name = name, code = code, sourceEventNames = sourceEventNames ) } else { val trackOnce = if (event.has(KEY_TRACK_ONCE)) json.get(KEY_TRACK_ONCE).asBoolean else null Screen( name = name, code = code, trackOnce = trackOnce ) } } const val KET_ROOT_EVENTS = "events" const val KEY_EVENT = "event" const val KEY_CODE = "code" const val KEY_TRACK_ONCE = "track_once" const val KEY_FROM_EVENTS = "from_events" } }