Интеграция потребителей Zio-Kafka с десериализатором Zio-Json

Я изучаю библиотеку zio-kafka, и я хочу использовать zio-json для десериализации значений сообщений в формате JSON.

У меня есть простой класс case вместе с его декодером и кодировщиком:

      case class Player(name: String, score: Int)
object Player {
  implicit val decoder: JsonDecoder[Player] = DeriveJsonDecoder.gen[Player]
  implicit val encoder: JsonEncoder[Player] = DeriveJsonEncoder.gen[Player]
}

Прямо сейчас я создал Serde начиная с Serde.string который использует указанный выше декодер / кодировщик:

      val playerSerde: Serde[Any, Player] = Serde.string.inmapM { playerAsString =>
  ZIO.fromEither(playerAsString.fromJson[Match].left.map(new RuntimeException(_)))
} { playerAsObj =>
  ZIO.effect(playerAsObj.toJson)
}

Это правильно? Есть ли другой (лучший) подход?

1 ответ

Рассмотрите возможность использования .getOrElse поскольку я думаю, что это немного проясняет намерение и позволяет избежать открытого доступа к левому полю:

        val playerSerde: Serde[Any, Player] = Serde.string.inmapM { playerAsString =>
    ZIO.effectTotal(playerAsString.fromJson[Player].getOrElse(throw new Error))
  }(playerAsObj => ZIO.effect(playerAsObj.toJson))

Я также предположил, что вы имели в виду .fromJson[Player] поскольку я не видел Match класс в любом месте вашего вопроса.

Другие вопросы по тегам