喷雾编组 cats.data.Xor

spray marshalling cats.data.Xor

我正在使用 spray 编写 REST api,并且在 json 编组方面遇到了一些困难。我的服务 returns cats.data.Xor[失败,成功]。我如何从 REST 端点 return 这种数据类型?如何为此编写响应编组器?

最简单的解决方案就是在路由器中的值上调用 toEither,这让 Spray 提供的 Either 编组器接管。

另一种解决方案是提供您自己的编组器(我自己已经做过几次):

import cats.data.Xor
import spray.httpx.marshalling.ToResponseMarshaller

implicit def xorMarshaller[A, B](implicit
  ma: ToResponseMarshaller[A],
  mb: ToResponseMarshaller[B]
): ToResponseMarshaller[Xor[A, B]] =
  ToResponseMarshaller[Xor[A, B]] { (value, ctx) =>
    value match {
      case Xor.Left(a)  => ma(a, ctx)
      case Xor.Right(b) => mb(b, ctx)
    }
  }

这可以让您避免转换的运行时成本(可能可以忽略不计)和句法成本(可以忽略不计)。

请注意,Cats 将在即将发布的版本中删除 Xor 以支持标准库的 Either,因此目前仅使用 toEither 可能是最实用的解决方案。