diff --git a/modules/openapi-generator/src/main/resources/scala-http4s/model.mustache b/modules/openapi-generator/src/main/resources/scala-http4s/model.mustache index 118fdb0fabd..1178f7cdbc4 100644 --- a/modules/openapi-generator/src/main/resources/scala-http4s/model.mustache +++ b/modules/openapi-generator/src/main/resources/scala-http4s/model.mustache @@ -56,7 +56,7 @@ object {{classname}} { given decoder{{classname}}: Decoder[{{classname}}] = Decoder.instance { c => for { {{#vars}} - {{name}} <- c.downField("{{baseName}}").as[{{^required}}Option[{{{dataType}}}]{{/required}}{{#required}}{{{dataType}}}{{/required}}] + {{name}} <- {{#isEnumOrRef}}{{^required}}mapEmptyStringToNull(c.downField("{{baseName}}")){{/required}}{{#required}}c.downField("{{baseName}}"){{/required}}{{/isEnumOrRef}}{{^isEnumOrRef}}c.downField("{{baseName}}"){{/isEnumOrRef}}.as[{{^required}}Option[{{{dataType}}}]{{/required}}{{#required}}{{{dataType}}}{{/required}}] {{/vars}} } yield {{classname}}( {{#vars}} diff --git a/modules/openapi-generator/src/main/resources/scala-http4s/modelsPackage.mustache b/modules/openapi-generator/src/main/resources/scala-http4s/modelsPackage.mustache index 3c99460f4b8..ca003c63495 100644 --- a/modules/openapi-generator/src/main/resources/scala-http4s/modelsPackage.mustache +++ b/modules/openapi-generator/src/main/resources/scala-http4s/modelsPackage.mustache @@ -1,7 +1,7 @@ {{>licenseInfo}} package {{packageName}} -import io.circe.{Decoder, Encoder, Json} +import io.circe.{Decoder, Encoder, Json, ACursor} import java.time.{Instant, LocalDate, OffsetDateTime} import java.util.UUID @@ -31,4 +31,7 @@ package object models { given encodeJson: Encoder[Json] = Encoder.encodeString.contramap[Json](_.toString) + def mapEmptyStringToNull(f: ACursor): ACursor = + f.withFocus(json => if json.toString == "\"\"" then Json.Null else json) + } \ No newline at end of file diff --git a/samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/Order.scala b/samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/Order.scala index a9649cc85ca..c43f5098eb8 100644 --- a/samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/Order.scala +++ b/samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/Order.scala @@ -52,7 +52,7 @@ object Order { petId <- c.downField("petId").as[Option[Long]] quantity <- c.downField("quantity").as[Option[Int]] shipDate <- c.downField("shipDate").as[Option[Instant]] - status <- c.downField("status").as[Option[OrderStatus]] + status <- mapEmptyStringToNull(c.downField("status")).as[Option[OrderStatus]] complete <- c.downField("complete").as[Option[Boolean]] } yield Order( id = id, diff --git a/samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/Pet.scala b/samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/Pet.scala index 2800dcbdb4b..011920e024f 100644 --- a/samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/Pet.scala +++ b/samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/Pet.scala @@ -53,7 +53,7 @@ object Pet { name <- c.downField("name").as[String] photoUrls <- c.downField("photoUrls").as[Seq[String]] tags <- c.downField("tags").as[Option[Seq[Tag]]] - status <- c.downField("status").as[Option[PetStatus]] + status <- mapEmptyStringToNull(c.downField("status")).as[Option[PetStatus]] } yield Pet( id = id, category = category, diff --git a/samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/package.scala b/samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/package.scala index 17fb2a64702..b90140c2391 100644 --- a/samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/package.scala +++ b/samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/package.scala @@ -10,7 +10,7 @@ */ package org.openapitools.client -import io.circe.{Decoder, Encoder, Json} +import io.circe.{Decoder, Encoder, Json, ACursor} import java.time.{Instant, LocalDate, OffsetDateTime} import java.util.UUID @@ -40,4 +40,7 @@ package object models { given encodeJson: Encoder[Json] = Encoder.encodeString.contramap[Json](_.toString) + def mapEmptyStringToNull(f: ACursor): ACursor = + f.withFocus(json => if json.toString == "\"\"" then Json.Null else json) + } \ No newline at end of file