While working on upgrading our Tapir version I have run into an issue where Wartremover infers a Product type on our multipartbody. I have some example code with the issue:
//> using scala 2.13
//> using lib com.softwaremill.sttp.tapir::tapir-core:1.8.4
//> using lib org.scala-lang.modules::scala-xml:1.3.0
//> using lib io.circe::circe-generic:0.14.6
//> using plugin org.wartremover:::wartremover:3.1.5
//> using option "-P:wartremover:traverser:org.wartremover.warts.Product"
import io.circe.Codec
import io.circe.generic.semiauto.deriveCodec
import sttp.tapir._
import sttp.model.Part
import sttp.tapir.Schema
import java.io.File
object Example {
final case class Model(int: Int)
final case class multiExample(model: Model, part: Part[File])
object Model {
implicit val modelCodec: Codec[Model] = deriveCodec
implicit lazy val modelSchema: Schema[Model] = Schema.derived[Model]
}
object multiExample {
implicit lazy val multiExampleSchema: Schema[multiExample] = Schema.derived[multiExample]
}
val example =
endpoint
.tag("example")
.post
.in(multipartBody[multiExample])
}
The above works fine until for any version lower then 0.20.0, but breaks afterwards. Thinking it might just be wartremover, I have tried suppressing the warning, however that resulted in the endpoint not being accessible at all.
In my testing I have also noticed that this only happens if you have a custom class within the class in the multipartBody, e.g. if in the above you change the model: Model to model: String, this will compile without any errors.
Does anyone have any clue as to why this might be, and possibly some kind of answer on how to solve the problem?