Поле статуса в json с Tapir

Как я мог добавить status в ответ json в тапире?

Предположим, у меня есть конечная точка, которая выглядит так:

private lazy val endpoint =
  endpoint
    .post
    .in(jsonBody[Entity])
    .out(jsonBody[ChangedEntity])
    .errorOut(jsonBody[Error])
    .serverLogic {
      changeEntity
    }

def changeEntity(e: Entity): Future[Either[Error, ChangedEntity]] = ...

case class Error(
  msg: String,
  code: Int,
)

case class ChangedEntity(
  id: Int,
  data: String,
)

Мой кодировщик Circe

implicit def encodeResponse[R](implicit
                               left: Encoder[Error],
                               right: Encoder[R]
                              ): Encoder[Either[Error, R]] = {
  o: Either[Error, R] =>
    o.fold(_.asJson, _.asJson).mapObject(_.+:(status, o.isRight.asJson))
}

Я бы хотел получить такой json:

//on success
{
    "status": true,
    "id": 42,
    "data": "some data
}

//on error
{
    "status": false
    "msg": "error happenend",
    "code": 12345
}

Если я буду использовать этот кодировщик circe в Akka Http, он закодирует поле статуса. Как я могу достичь той же идеи в Тапире? Должен ли я как-то использовать собственный кодек?

0 ответов

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