Skip to content
This repository has been archived by the owner on Oct 20, 2023. It is now read-only.

Commit

Permalink
Merge pull request #250 from alycklama/adds-support-for-returning-the…
Browse files Browse the repository at this point in the history
…-same-error-across-multiple-status-codes

Adds support for returning the same error across multiple status codes
  • Loading branch information
ghostbuster91 committed Mar 7, 2023
2 parents 34c55b0 + 5139224 commit f9f2e66
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.github.ghostbuster91.sttp.client3.openapi

import cats.implicits.catsSyntaxEq
import io.swagger.v3.oas.models.media.ComposedSchema
import sttp.model.StatusCode

Expand All @@ -15,9 +16,20 @@ object OpenApiCoproductGenerator {
collectCandidates(openApi, childToParent, collectErrorResponses)
val successesWithoutCommonParent =
collectCandidates(openApi, childToParent, collectSuccessResponses)

errorsWithoutCommonParent.foreach { case (operationId, schemas) =>
require(
schemas.distinct.map(_.ref.ref) === schemas
.map(_.ref.ref)
.distinct,
s"$operationId cannot have different schemas for the same ref: ${schemas.distinct
.map(_.ref)}"
)
}

val newCoproducts = errorsWithoutCommonParent
.map(kv =>
createCoproduct(kv._1, kv._2, "GenericError")
createCoproduct(kv._1, kv._2.distinct, "GenericError")
) ++ successesWithoutCommonParent
.map(kv => createCoproduct(kv._1, kv._2, "GenericSuccess"))

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package io.github.ghostbuster91.sttp.client3.example

import _root_.sttp.client3._
import _root_.sttp.model._
import _root_.io.circe.{Error => CirceError}
import _root_.io.circe.Decoder
import _root_.io.circe.Encoder
import _root_.sttp.client3.circe.SttpCirceApi

trait CirceCodecs extends SttpCirceApi {
implicit lazy val errorModelDecoder: Decoder[ErrorModel] =
Decoder.forProduct1("msg")(ErrorModel.apply)
implicit lazy val errorModelEncoder: Encoder[ErrorModel] =
Encoder.forProduct1("msg")(p => p.msg)
implicit lazy val updatePersonGenericErrorDecoder
: Decoder[UpdatePersonGenericError] =
List[Decoder[UpdatePersonGenericError]](
Decoder[ErrorModel].asInstanceOf[Decoder[UpdatePersonGenericError]]
).reduceLeft(_ or _)
implicit lazy val updatePersonGenericErrorEncoder
: Encoder[UpdatePersonGenericError] = Encoder.instance {
case errorModel: ErrorModel =>
Encoder[ErrorModel].apply(errorModel)
}
}
object CirceCodecs extends CirceCodecs

sealed trait UpdatePersonGenericError
case class ErrorModel(msg: String) extends UpdatePersonGenericError()

class DefaultApi(baseUrl: String, circeCodecs: CirceCodecs = CirceCodecs) {
import circeCodecs._

def updatePerson(): Request[
Either[ResponseException[UpdatePersonGenericError, CirceError], Unit],
Any
] = basicRequest
.put(uri"$baseUrl/person")
.response(
fromMetadata(
asJsonEither[UpdatePersonGenericError, Unit],
ConditionalResponseAs(
_.code == StatusCode.unsafeApply(400),
asJsonEither[ErrorModel, Unit]
),
ConditionalResponseAs(
_.code == StatusCode.unsafeApply(401),
asJsonEither[ErrorModel, Unit]
)
)
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
openapi: 3.0.2
info:
title: Single Error
version: "1.0"
paths:
/person:
put:
summary: Update an existing person
description: Update an existing person by Id
operationId: updatePerson
responses:
"400":
description: Returns a 400
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorModel"
"401":
description: Returns a 401
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorModel"
components:
schemas:
ErrorModel:
required:
- msg
type: object
properties:
msg:
type: string
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ object GeneratorTest extends TestSuite {
"product" - test(CodegenConfig(handleErrors = true))
"multiple_errors" - test(CodegenConfig(handleErrors = true))
"multiple_errors_with_parent" - test(CodegenConfig(handleErrors = true))
"single_error_for_multiple_status_codes" - test(CodegenConfig(handleErrors = true))
}
"multiple_success" - {
"separate_products" - test()
Expand Down

0 comments on commit f9f2e66

Please sign in to comment.