Скала, коты - конвертируй ФУУИД с Цирцеей - PullRequest
0 голосов
/ 21 апреля 2019

Я использую эту библиотеку https://christopherdavenport.github.io/fuuid/ для создания ID пользовательских объектов и сохраняю их в базе данных.У меня есть простой case class, который является моей моделью:

import io.chrisdavenport.fuuid.FUUID

case class Bet(
  betId: Option[FUUID],
  home: String,
  away: String,
  stake: BigDecimal,
  betType: String)

Я использовал FUUID здесь в качестве параметра Option.У меня также есть routes, созданный с помощью Http4s, который должен взять json из входных данных и отобразить его в модель:

class BettingRoutes[F[_] : Async](service: BettingService[F]) extends Http4sDsl[F] {

  def routes: HttpRoutes[F] = HttpRoutes.of[F] {
    case req@PUT -> Root / "bets" =>
      for {
        bet <- req.as[Bet]
        created <- service.put(bet)
        response <- Created(created)
      } yield response
   }
}

Я также добавил implicits для кодирования и декодирования из Circe:

object jsons {
  implicit def circeDecoder[A[_] : Sync, B: Decoder]: EntityDecoder[A, B] = jsonOf[A, B]
  implicit def circeEncoder[A[_] : Sync, B: Encoder]: EntityEncoder[A, B] = jsonEncoderOf[A, B]
}

Проблема в том, что когда я хочу скомпилировать проект, я получаю такие ошибки в классе маршрута:

Error:(23, 22) Cannot decode into a value of type model.Bet, because no EntityDecoder[F, model.Bet] instance could be found.
        bet <- req.as[Bet]

Error:(23, 22) not enough arguments for method as: (implicit F: cats.Functor[F], implicit decoder: org.http4s.EntityDecoder[F,model.Bet])F[model.Bet].
Unspecified value parameter decoder.
        bet <- req.as[Bet]

Error:(25, 28) Cannot convert from model.Bet to an Entity, because no EntityEncoder[F, model.Bet] instance could be found.
        response <- Created(created)

и т. Д.Я исследовал это, и он появляется из-за использования FUUID.Я изменил все FUUID классы на Long и после этого просто на java UUID, а затем все правильно компилируется без ошибок.Проблема только с FUUID и, вероятно, с преобразованием.Я пытался использовать Circe Integration, как показано в ссылке FUUID выше, но это не помогло.Вы знаете, как исправить этот код, чтобы компилировать все с fuuid и circe?Я новичок в cats и подключенных библиотеках, так что, возможно, это простая ошибка, но сейчас это не тривиально для меня.

1 Ответ

3 голосов
/ 21 апреля 2019

Чтобы получить EntityDecoder[F, Bet] через jsons.circeDecoder, нам сначала нужно Decoder[Bet].Он может быть автоматически сгенерирован Circe, если у нас есть декодеры для всех полей.Дело в том, что есть Decoder[UUID], но нет Decoder[FUUID].

Так что просто определите необходимые неявные

implicit val fuuidDecoder: Decoder[FUUID] = Decoder[UUID].map(FUUID.fromUUID)

Аналогично для кодеров

implicit val fuuidEncoder: Encoder[FUUID] = Encoder[UUID].contramap(FUUID.Unsafe.toUUID)
...