我是第一次玩 Scala,所以请耐心等待。还使用 tapir 声明 API,我在为枚举提供 Schema 时遇到问题。
我定义了一堆枚举,它们是我的域模型的一部分,并且扩展了 Scala 的Enumeration
. 例如,这是其中之一:
object Status extends Enumeration with JsonEnumeration {
val Active, Completed, Archived, Deleted = Value
}
并且还有许多使用它们的案例类。例如,Order
使用我们之前定义的枚举,例如:
case class Order(
id: String,
name: Option[String],
status: Status.Value,
)
我想让这个枚举实现一个添加隐式但不修改原始Status
枚举的特征(我不想将 Status 枚举和所有其他枚举耦合到这个特征)。
特征看起来像:
import sttp.tapir.{Schema, Validator}
trait TapirEnumeration { e: Enumeration =>
implicit def schemaForEnum: Schema[e.Value] =
Schema.string.validate(Validator.enumeration(e.values.toList, v => Option(v)))
}
我想以某种方式修改Order
对象,因此Status
枚举现在是一个TapirStatus
枚举(或类似的东西),它扩展了原始Status
和TapirEnumeration
,但我认为这是不可行的,因为它Status
最初被定义为伴随对象。
理想情况下,我想作为 API 的响应公开的所有枚举都将实现该TapirEnumeration
特征,同时仍扩展它们已经扩展的内容。
我能做些什么来实现这一目标?当然,创建一个实现该特征的新枚举并不是 DRY,所以它不是一个选项。