Skip to content

Commit 6be478d

Browse files
authored
[Fix][scala-sttp][circe] Add NaN-tolerant Decoder[Double] for non-finite values (#23611)
* [Fix] Handle NaN and other double serialization types * Update tests
1 parent 3971b4f commit 6be478d

3 files changed

Lines changed: 21 additions & 1 deletion

File tree

modules/openapi-generator/src/main/resources/scala-sttp/additionalTypeSerializers.mustache

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,13 @@ trait AdditionalTypeSerializers {
7171
case s: String => Json.fromString(s)
7272
case other => Json.fromString(other.toString)
7373
}
74+
75+
implicit final lazy val NanTolerantDoubleDecoder: Decoder[Double] =
76+
Decoder.decodeDouble.or(Decoder.decodeString.emap {
77+
case "NaN" => Right(Double.NaN)
78+
case "Infinity" => Right(Double.PositiveInfinity)
79+
case "-Infinity" => Right(Double.NegativeInfinity)
80+
case s => Left(s"Cannot decode '$s' as Double")
81+
})
7482
}
7583
{{/circe}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/scala/ScalaSttpCirceCodegenTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,16 @@ public void verifyBaseNameFieldMapping() throws IOException {
7373
assertFileContains(binaryPath, "implicit val encoderBinaryPayload");
7474
assertFileContains(binaryPath, "implicit val decoderBinaryPayload");
7575

76-
// AdditionalTypeSerializers: File and Any codecs
76+
// AdditionalTypeSerializers: File, Any, and NaN-tolerant Double codecs
7777
Path serializersPath = Paths.get(outputPath + "/src/main/scala/org/openapitools/client/core/AdditionalTypeSerializers.scala");
7878
assertFileContains(serializersPath, "FileDecoder");
7979
assertFileContains(serializersPath, "FileEncoder");
8080
assertFileContains(serializersPath, "AnyDecoder");
8181
assertFileContains(serializersPath, "AnyEncoder");
82+
assertFileContains(serializersPath, "NanTolerantDoubleDecoder");
83+
assertFileContains(serializersPath, "Double.NaN");
84+
assertFileContains(serializersPath, "Double.PositiveInfinity");
85+
assertFileContains(serializersPath, "Double.NegativeInfinity");
8286

8387
// JsonSupport should NOT use AutoDerivation
8488
Path jsonSupportPath = Paths.get(outputPath + "/src/main/scala/org/openapitools/client/core/JsonSupport.scala");

samples/client/petstore/scala-sttp-circe/src/main/scala/org/openapitools/client/core/AdditionalTypeSerializers.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,12 @@ trait AdditionalTypeSerializers {
4848
case s: String => Json.fromString(s)
4949
case other => Json.fromString(other.toString)
5050
}
51+
52+
implicit final lazy val NanTolerantDoubleDecoder: Decoder[Double] =
53+
Decoder.decodeDouble.or(Decoder.decodeString.emap {
54+
case "NaN" => Right(Double.NaN)
55+
case "Infinity" => Right(Double.PositiveInfinity)
56+
case "-Infinity" => Right(Double.NegativeInfinity)
57+
case s => Left(s"Cannot decode '$s' as Double")
58+
})
5159
}

0 commit comments

Comments
 (0)