Skip to content

Commit 80ab53b

Browse files
JennyLeahyJenny LeahyJenny Leahy
authored
[scala][client]: scala-http4s scala3 client: minor improvement (allow empty string in optional enum to pass as None) (#21025)
* [scala][http4s][client]: add enum method; remove implicit * improve error handling * more enum enhancement * remove unused * update samle * avoid breaking change * [Scala][Client][HTTP4s]: when enum is optional, avoid throwing exception when it's empty string --------- Co-authored-by: Jenny Leahy <[email protected]> Co-authored-by: Jenny Leahy <[email protected]>
1 parent 3233eff commit 80ab53b

File tree

5 files changed

+11
-5
lines changed

5 files changed

+11
-5
lines changed

modules/openapi-generator/src/main/resources/scala-http4s/model.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ object {{classname}} {
5656
given decoder{{classname}}: Decoder[{{classname}}] = Decoder.instance { c =>
5757
for {
5858
{{#vars}}
59-
{{name}} <- c.downField("{{baseName}}").as[{{^required}}Option[{{{dataType}}}]{{/required}}{{#required}}{{{dataType}}}{{/required}}]
59+
{{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}}]
6060
{{/vars}}
6161
} yield {{classname}}(
6262
{{#vars}}

modules/openapi-generator/src/main/resources/scala-http4s/modelsPackage.mustache

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{{>licenseInfo}}
22
package {{packageName}}
33

4-
import io.circe.{Decoder, Encoder, Json}
4+
import io.circe.{Decoder, Encoder, Json, ACursor}
55
import java.time.{Instant, LocalDate, OffsetDateTime}
66
import java.util.UUID
77

@@ -31,4 +31,7 @@ package object models {
3131
given encodeJson: Encoder[Json] =
3232
Encoder.encodeString.contramap[Json](_.toString)
3333
34+
def mapEmptyStringToNull(f: ACursor): ACursor =
35+
f.withFocus(json => if json.toString == "\"\"" then Json.Null else json)
36+
3437
}

samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/Order.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ object Order {
5252
petId <- c.downField("petId").as[Option[Long]]
5353
quantity <- c.downField("quantity").as[Option[Int]]
5454
shipDate <- c.downField("shipDate").as[Option[Instant]]
55-
status <- c.downField("status").as[Option[OrderStatus]]
55+
status <- mapEmptyStringToNull(c.downField("status")).as[Option[OrderStatus]]
5656
complete <- c.downField("complete").as[Option[Boolean]]
5757
} yield Order(
5858
id = id,

samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/Pet.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ object Pet {
5353
name <- c.downField("name").as[String]
5454
photoUrls <- c.downField("photoUrls").as[Seq[String]]
5555
tags <- c.downField("tags").as[Option[Seq[Tag]]]
56-
status <- c.downField("status").as[Option[PetStatus]]
56+
status <- mapEmptyStringToNull(c.downField("status")).as[Option[PetStatus]]
5757
} yield Pet(
5858
id = id,
5959
category = category,

samples/client/petstore/scala-http4s/src/main/scala/org/openapitools/client/models/package.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*/
1111
package org.openapitools.client
1212

13-
import io.circe.{Decoder, Encoder, Json}
13+
import io.circe.{Decoder, Encoder, Json, ACursor}
1414
import java.time.{Instant, LocalDate, OffsetDateTime}
1515
import java.util.UUID
1616

@@ -40,4 +40,7 @@ package object models {
4040
given encodeJson: Encoder[Json] =
4141
Encoder.encodeString.contramap[Json](_.toString)
4242

43+
def mapEmptyStringToNull(f: ACursor): ACursor =
44+
f.withFocus(json => if json.toString == "\"\"" then Json.Null else json)
45+
4346
}

0 commit comments

Comments
 (0)