diff --git a/asyncapi-circe/src/main/scala/sttp/apispec/asyncapi/circe/package.scala b/asyncapi-circe/src/main/scala/sttp/apispec/asyncapi/circe/package.scala index 9a29cb0..879cb1a 100644 --- a/asyncapi-circe/src/main/scala/sttp/apispec/asyncapi/circe/package.scala +++ b/asyncapi-circe/src/main/scala/sttp/apispec/asyncapi/circe/package.scala @@ -15,6 +15,11 @@ package circe { import sttp.apispec.internal.JsonSchemaCirceEncoders trait SttpAsyncAPICirceEncoders extends JsonSchemaCirceEncoders { + // note: avoids rendering of (unsupported) discriminator mapping + override implicit val encoderDiscriminator: Encoder[Discriminator] = { + case Discriminator(propertyName, _) => Json.obj("discriminator" := propertyName) + } + // note: these are strict val-s, order matters! implicit val encoderReference: Encoder[Reference] = deriveEncoder[Reference] implicit def encoderReferenceOr[T: Encoder]: Encoder[ReferenceOr[T]] = { diff --git a/asyncapi-circe/src/test/scala/sttp/apispec/asyncapi/circe/EncoderTest.scala b/asyncapi-circe/src/test/scala/sttp/apispec/asyncapi/circe/EncoderTest.scala index 60567fe..2e384ab 100644 --- a/asyncapi-circe/src/test/scala/sttp/apispec/asyncapi/circe/EncoderTest.scala +++ b/asyncapi-circe/src/test/scala/sttp/apispec/asyncapi/circe/EncoderTest.scala @@ -183,6 +183,33 @@ class EncoderTest extends AnyFunSuite { assert(expected === comp.asJson.deepDropNullValues) } + test("encode discriminator") { + val expected = + parse("""{ + | "payload" : { + | "oneOf" : [ + | { + | "$ref" : "Dog" + | }, + | { + | "$ref" : "Cat" + | } + | ], + | "discriminator" : { + | "discriminator" : "pet" + | } + | } + |}""".stripMargin) + + val schema = Schema.oneOf( + List(Schema.referenceTo("", "Dog"), Schema.referenceTo("", "Cat")), + Some(Discriminator("pet", Some(ListMap("Dog" -> "Dog", "Cat" -> "Cat"))))) + val message = SingleMessage(payload = Some(Right(schema))) + + assert(expected === message.asJson.deepDropNullValues) + } + + def parse(s: String): Json = io.circe.parser.parse(s).fold(throw _, identity) }