package util import com.fasterxml.jackson.databind.json.JsonMapper import com.fasterxml.jackson.module.scala.ScalaModule import de.knockoutwhist.utils.events.SimpleEvent import logic.game.GameLobby import play.api.libs.json.{JsValue, Json} import util.mapper.{GameStateChangeEventMapper, NewRoundEventMapper, NewTrickEventMapper, ReceivedHandEventMapper, RequestCardEventMapper, SimpleEventMapper, TrickEndEventMapper} object WebsocketEventMapper { private val scalaModule = ScalaModule.builder() .addAllBuiltinModules() //.supportScala3Classes(true) .build() private val mapper = JsonMapper.builder().addModule(scalaModule).build() private var customMappers: Map[String,SimpleEventMapper[SimpleEvent]] = Map() private def registerCustomMapper[T <: SimpleEvent](mapper: SimpleEventMapper[T]): Unit = { customMappers = customMappers + (mapper.id -> mapper.asInstanceOf[SimpleEventMapper[SimpleEvent]]) } // Register all custom mappers here registerCustomMapper(ReceivedHandEventMapper) registerCustomMapper(NewRoundEventMapper) registerCustomMapper(NewTrickEventMapper) registerCustomMapper(TrickEndEventMapper) registerCustomMapper(RequestCardEventMapper) registerCustomMapper(GameStateChangeEventMapper) def toJson(obj: SimpleEvent, gameLobby: GameLobby): JsValue = { val data: Option[JsValue] = if (customMappers.contains(obj.id)) { Some(customMappers(obj.id).toJson(obj, gameLobby)) }else { None } if (data.isEmpty) { return Json.obj() } Json.obj( "id" -> ("request-" + java.util.UUID.randomUUID().toString), "event" -> obj.id, "data" -> data ) } }