in handlers/product-move-api/src/main/scala/com/gu/productmove/zuora/rest/ZuoraClient.scala [97:133]
def attemptDecode[A](body: String)(implicit decoder: JsonDecoder[A]) =
body.fromJson[A].left.map(e => new Throwable("attempt decode: " + e))
def parseIfSuccessful[A: JsonDecoder](
body: String,
zuoraSuccessCheck: ZuoraSuccessCheck,
): Either[Throwable, A] = {
val isSuccessful: Either[Throwable, Unit] = zuoraSuccessCheck match {
case ZuoraSuccessCheck.SuccessCheckSize =>
for {
zuoraResponse <- attemptDecode[ZuoraSuccessSize](body)
succeeded = zuoraResponse.size.isEmpty // size field only exists if it's not found.
_ <- if (succeeded) Right(()) else Left(new Throwable(s"size = 0, body: $body"))
} yield ()
case ZuoraSuccessCheck.SuccessCheckLowercase =>
for {
zuoraResponse <- attemptDecode[ZuoraSuccessLowercase](body)
_ <-
if (zuoraResponse.success) Right(())
else Left(ZuoraClientError(body, zuoraResponse.reasons.getOrElse(Nil)))
} yield ()
case ZuoraSuccessCheck.SuccessCheckCapitalised =>
for {
zuoraResponse <- attemptDecode[ZuoraSuccessCapitalised](body)
_ <-
if (zuoraResponse.Success) Right(())
else Left(ZuoraClientError(body, zuoraResponse.reasons.getOrElse(Nil)))
} yield ()
case ZuoraSuccessCheck.None => Right(())
}
isSuccessful.flatMap(_ =>
body.fromJson[A].left.map(errorMessage => new Throwable(s"json parsing error $errorMessage with body $body")),
)
}