def attemptDecode[A]()

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")),
    )
  }