status
Tapirの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
}
Akka Http でその circe エンコーダーを使用すると、ステータス フィールドがエンコードされます。Tapirで同じアイデアを実現するにはどうすればよいですか? どうにかしてカスタム コーデックを使用する必要がありますか?