softwaremill / softwaremill/tapir
[BUG]tapir_enumeratum doest not handle @customise annotation and shortEnum output String type.
Open
@rwalerow is already working on this.
Since Aug 17, 2026.
- Dominant language
- Scala
- Stars
- 1.5k
- Forks
- 468
- Avg merge
- 5h 37m
- Merged PRs (30d)
- 34
Description
Tapir version: 1.11.12
Scala version: 3.6.1
the following code:
import sttp.tapir.Schema.annotations.customise
import sttp.tapir.generic.auto.*
import sttp.tapir.json.circe.*
import sttp.tapir.codec.enumeratum.{schemaForShortEnumEntry, schemaForIntEnumEntry}
import sttp.tapir.docs.apispec.DocsExtensionAttribute.*
@customise(s => s.docsExtension("x-enum-varnames", List("UnPaid", "Paid", "Finish", "Cancel")))
sealed abstract class OrderStatus(val value: Short) extends ShortEnumEntry
object OrderStatus
extends ShortEnum[OrderStatus]
with ShortCirceEnum[OrderStatus] {
case object UnPaid extends OrderStatus(0)
case object Paid extends OrderStatus(1)
case object Finish extends OrderStatus(2)
case object Cancel extends OrderStatus(3)
val values = findValues
given orderStatusTypeMapper: TypeMapper[OrderStatus] =
new TypeMapper[OrderStatus] {
def jdbcType: JDBCType = JDBCType.TINYINT
def get(r: ResultSet, idx: Int): OrderStatus =
OrderStatus.withValue(r.getShort(idx))
def put(r: PreparedStatement, idx: Int, v: OrderStatus): Unit =
r.setShort(idx, v.value)
}
}
would output:
components:
schemas:
OrderStatus:
title: OrderStatus
type: integer
enum:
- '0'
- '1'
- '2'
- '3'
problems are:
- does not handle @customise annotation correctly, this may be diffcult to fix.
- https://github.com/softwaremill/sttp-apispec/blob/327d37c16677818dbe46ab9f32f72b3473d6705c/jsonschema-circe/src/main/scala/sttp/apispec/internal/JsonSchemaCirceEncoders.scala#L129 does not handle short
If I chnage the code to:
sealed abstract class OrderStatus(val value: Short) extends ShortEnumEntry
object OrderStatus
extends ShortEnum[OrderStatus]
with ShortCirceEnum[OrderStatus] {
case object UnPaid extends OrderStatus(0)
case object Paid extends OrderStatus(1)
case object Finish extends OrderStatus(2)
case object Cancel extends OrderStatus(3)
val values = findValues
import sttp.tapir.codec.enumeratum.schemaForShortEnumEntry
given Schema[OrderStatus] = {
schemaForShortEnumEntry[OrderStatus]
.docsExtension("x-enum-varnames", List("UnPaid", "Paid", "Finish", "Cancel")).format("int32")
}
}
the output. would be
OrderStatus:
title: OrderStatus
type: integer
enum:
- '0'
- '1'
- '2'
- '3'
format: int32
x-enum-varnames:
- UnPaid
- Paid
- Finish
- Cancel
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.