[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 <jennyleahy@JENNYLEAHY.localdomain>
Co-authored-by: Jenny Leahy <jennyleahy@Mac.localdomain>
This commit is contained in:
Jenny G. L. 2025-04-23 02:21:33 -04:00 committed by GitHub
parent 3233eff187
commit 80ab53b2ce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 11 additions and 5 deletions

View File

@ -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}}

View File

@ -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)
}

View File

@ -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,

View File

@ -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,

View File

@ -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)
}