декодер для улучшенного типа при использовании circe с Http4s

Я пытаюсь использовать уточненные типы для класса case, но не могу понять, как на самом деле будет работать кодировщик. Для разбора json используется circe с библиотекой https4s.

  type AgeT = Int Refined Interval.ClosedOpen[0,100]
  type NameT = String Refined NonEmptyString
  case class Person(name: NameT,age: AgeT)
  object Person  {
    implicit val encoder: Encoder[Person] =  deriveEncoder[Person]
    implicit val decoder: Decoder[Person] =  deriveDecoder[Person]
  }

  implicit val decoder = jsonOf[IO,Person]
  val jsonWithValidationService = HttpRoutes.of[IO] {
    case req @ POST -> Root / "jsonBody" =>
        for {
          c <- req.as[Person]
          res <-Ok(c.asJson)
        } yield res
  }.orNotFound

ошибка

Error:(61, 59) could not find Lazy implicit value of type io.circe.generic.decoding.DerivedDecoder[server.Routes.Person]
    implicit val decoder: Decoder[Person] =  deriveDecoder[Person]

В худшем случае мне нужно определить свой собственный декодер и проанализировать его. Но если есть какой-то другой способ еще больше упростить, было бы неплохо.

1 ответ

Решение
type NameT = String Refined NonEmptyString

неправильно. Замени его на

type NameT = String Refined NonEmpty

В противном случае NonEmptyString уже String Refined NonEmpty И в NameT ты сделаешь Refined дважды, что неверно.

Или вы можете просто определить

type NameT = NonEmptyString

Не забывайте импорт

import cats.effect.IO
import eu.timepit.refined.api.Refined
import eu.timepit.refined.numeric.Interval
import eu.timepit.refined.collection.NonEmpty
import eu.timepit.refined.types.string.NonEmptyString
import io.circe.{Decoder, Encoder}
import io.circe.generic.semiauto._
import io.circe.syntax._
import io.circe.refined._
import org.http4s.circe._
import org.http4s.dsl.io._
import org.http4s.implicits._
import org.http4s.HttpRoutes
Другие вопросы по тегам