Skip to content

Commit d7355ec

Browse files
committed
fix: sttp4 json4s JsonSupport uses sealed trait serializers instead of Enumeration-based EnumNameSerializer
The json4s variant of JsonSupport.scala used EnumNameSerializer which expects Scala Enumeration types, but sttp4 model templates generate sealed traits with case objects for enums. This caused compilation errors since the types are incompatible. Replace EnumNameSerializer with direct references to the implicit Serializer objects already defined in each enum's companion object.
1 parent cabdbe6 commit d7355ec

2 files changed

Lines changed: 4 additions & 50 deletions

File tree

modules/openapi-generator/src/main/resources/scala-sttp4/jsonSupport.mustache

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,11 @@ import {{modelPackage}}._
77
{{#json4s}}
88
import org.json4s._
99
import sttp.client4.json4s.SttpJson4sApi
10-
import scala.reflect.ClassTag
1110

1211
object JsonSupport extends SttpJson4sApi {
1312
def enumSerializers: Seq[Serializer[_]] = Seq[Serializer[_]](){{#models}}{{#model}}{{#isEnum}} :+
14-
new EnumNameSerializer({{classname}}){{/isEnum}}{{#hasEnums}}{{#vars}}{{#isEnum}} :+
15-
new EnumNameSerializer({{classname}}Enums.{{datatypeWithEnum}}){{/isEnum}}{{/vars}}{{/hasEnums}}{{/model}}{{/models}}
16-
17-
private class EnumNameSerializer[E <: Enumeration: ClassTag](enumeration: E) extends Serializer[E#Value] {
18-
import JsonDSL._
19-
val EnumerationClass: Class[E#Value] = classOf[E#Value]
20-
21-
def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), E#Value] = {
22-
case (t @ TypeInfo(EnumerationClass, _), json) if isValid(json) =>
23-
json match {
24-
case JString(value) => enumeration.withName(value)
25-
case value => throw new MappingException(s"Can't convert $value to $EnumerationClass")
26-
}
27-
}
28-
29-
private[this] def isValid(json: JValue) = json match {
30-
case JString(value) if enumeration.values.exists(_.toString == value) => true
31-
case _ => false
32-
}
33-
34-
def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
35-
case i: E#Value => i.toString
36-
}
37-
}
13+
{{classname}}.{{classname}}Serializer{{/isEnum}}{{#hasEnums}}{{#vars}}{{#isEnum}} :+
14+
{{classname}}Enums.{{datatypeWithEnum}}.{{datatypeWithEnum}}Serializer{{/isEnum}}{{/vars}}{{/hasEnums}}{{/model}}{{/models}}
3815

3916
implicit val format: Formats = DefaultFormats ++ enumSerializers ++ DateSerializers.all ++ AdditionalTypeSerializers.all
4017
implicit val serialization: org.json4s.Serialization = org.json4s.jackson.Serialization

samples/client/petstore/scala-sttp4/src/main/scala/org/openapitools/client/core/JsonSupport.scala

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,11 @@ package org.openapitools.client.core
1414
import org.openapitools.client.model._
1515
import org.json4s._
1616
import sttp.client4.json4s.SttpJson4sApi
17-
import scala.reflect.ClassTag
1817

1918
object JsonSupport extends SttpJson4sApi {
2019
def enumSerializers: Seq[Serializer[_]] = Seq[Serializer[_]]() :+
21-
new EnumNameSerializer(OrderEnums.Status) :+
22-
new EnumNameSerializer(PetEnums.Status)
23-
24-
private class EnumNameSerializer[E <: Enumeration: ClassTag](enumeration: E) extends Serializer[E#Value] {
25-
import JsonDSL._
26-
val EnumerationClass: Class[E#Value] = classOf[E#Value]
27-
28-
def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), E#Value] = {
29-
case (t @ TypeInfo(EnumerationClass, _), json) if isValid(json) =>
30-
json match {
31-
case JString(value) => enumeration.withName(value)
32-
case value => throw new MappingException(s"Can't convert $value to $EnumerationClass")
33-
}
34-
}
35-
36-
private[this] def isValid(json: JValue) = json match {
37-
case JString(value) if enumeration.values.exists(_.toString == value) => true
38-
case _ => false
39-
}
40-
41-
def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
42-
case i: E#Value => i.toString
43-
}
44-
}
20+
OrderEnums.Status.StatusSerializer :+
21+
PetEnums.Status.StatusSerializer
4522

4623
implicit val format: Formats = DefaultFormats ++ enumSerializers ++ DateSerializers.all ++ AdditionalTypeSerializers.all
4724
implicit val serialization: org.json4s.Serialization = org.json4s.jackson.Serialization

0 commit comments

Comments
 (0)