This repository was archived by the owner on Oct 20, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 11
invalid discriminator mapping after removing unused references when allOf is used #205
Copy link
Copy link
Open
Description
input:
openapi: 3.0.3
info:
title: Entities
version: "1.0"
paths:
/:
get:
operationId: getDog
responses:
"200":
description: ""
content:
application/json:
schema:
$ref: "#/components/schemas/Dog"
components:
schemas:
Pet:
type: object
required:
- petType
properties:
petType:
type: string
discriminator:
propertyName: petType
mapping:
dog: Dog
Dog:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Dog`
properties:
bark:
type: string
Lizard:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Lizard`
properties:
lovesRocks:
type: booleanoutput:
package io.github.ghostbuster91.sttp.client3.example
import _root_.sttp.client3._
import _root_.sttp.model._
import _root_.io.circe.Decoder
import _root_.io.circe.Encoder
import _root_.io.circe.HCursor
import _root_.io.circe.DecodingFailure
import _root_.io.circe.Decoder.Result
import _root_.sttp.client3.circe.SttpCirceApi
trait CirceCodecs extends SttpCirceApi {
implicit lazy val dogDecoder: Decoder[Dog] =
Decoder.forProduct1("bark")(Dog.apply)
implicit lazy val dogEncoder: Encoder[Dog] =
Encoder.forProduct2("petType", "bark")(p => ("dog", p.bark))
implicit lazy val petDecoder: Decoder[Pet] = new Decoder[Pet]() {
override def apply(c: HCursor): Result[Pet] = c
.downField("petType")
.as[String]
.flatMap {
case "Lizard" =>
Decoder[Lizard].apply(c)
case "dog" =>
Decoder[Dog].apply(c)
case other =>
Left(DecodingFailure("Unexpected value for coproduct:" + other, Nil))
}
}
implicit lazy val petEncoder: Encoder[Pet] = Encoder.instance {
case dog: Dog =>
Encoder[Dog].apply(dog)
case lizard: Lizard =>
Encoder[Lizard].apply(lizard)
}
}
object CirceCodecs extends CirceCodecs
sealed trait Pet
case class Dog(bark: Option[String]) extends Pet()
class DefaultApi(baseUrl: String, circeCodecs: CirceCodecs = CirceCodecs) {
import circeCodecs._
def getDog(): Request[Dog, Any] = basicRequest
.get(uri"$baseUrl")
.response(
fromMetadata(
asJson[Dog].getRight,
ConditionalResponseAs(
_.code == StatusCode.unsafeApply(200),
asJson[Dog].getRight
)
)
)
}commit hash: 90c99d6
Metadata
Metadata
Assignees
Labels
No labels