Scala, Circe, Http4s - есть ли способ кодировать Throwable в Circe?

Я создал иерархию ошибок:

sealed trait MyError extends Throwable
final case class SecondError(msg: String) extends MyError

Теперь я могу получить такую ​​ошибку в моих маршрутах http4s :

case GET -> Root / "things" => for {
        response <- things.all.foldM(
          error => error match {
            case SecondError(_) => InternalServerError(error)            
          }
...

Но я получаю скомпилированную ошибку:

could not find implicit value for parameter encoder: io.circe.Encoder[Throwable]

Можно ли кодировать Throwable с помощью http4s и http4s ? Я пытался сделать это так:

implicit def encoderHttpThrowable: EntityEncoder[Env, Throwable] = jsonEncoderOf[Env, Throwable]

Но это не решило проблему.

Всего 1 ответ


Невозможно автоматически кодировать иерархию Java с помощью Circe (или любой другой библиотеки) (я в этом совершенно уверен).

Итак, у вас есть 3 возможности:

  1. Просто используйте сообщение об ошибке:

    case GET -> Root / "things"  =>
        things.all.foldM (
          error => InternalServerError(error.getMessage()),
          Ok(_)
        )
    
  2. Или избавиться от Throwable:

      sealed trait MyError
      final case class SecondError(msg: String) extends MyError
    

    И теперь вы можете закодировать ошибку

    ...
    case GET -> Root / "things"  =>
      things.all.foldM (
        error => InternalServerError(error),
        Ok(_)
      )
    
  3. Сопоставьте свой Throwable с собственной ошибкой (Запечатанная черта без Throwable):

    ...
    case GET -> Root / "things"  =>
      things.all
        .mapError{
          case ex: IllegalArgumentException => SecondError(ex.getMessage)
          case ex => FirstError(ex.getMessage)
       }
        .foldM (
        error => InternalServerError(error),
        Ok(_)
      )
    

Есть идеи?

10000