softwaremill / softwaremill/tapir

[BUG]tapir_enumeratum doest not handle @customise annotation and shortEnum output String type.

Open
#4,292 0 comments 0 reactions 1 assignee View on GitHub

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

  1. does not handle @customise annotation correctly, this may be diffcult to fix.
  2. 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

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.