2

我是第一次玩 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枚举(或类似的东西),它扩展了原始StatusTapirEnumeration,但我认为这是不可行的,因为它Status最初被定义为伴随对象。

理想情况下,我想作为 API 的响应公开的所有枚举都将实现该TapirEnumeration特征,同时仍扩展它们已经扩展的内容。

我能做些什么来实现这一目标?当然,创建一个实现该特征的新枚举并不是 DRY,所以它不是一个选项。

4

1 回答 1

0

为什么首先需要在枚举本身中定义隐式?只需将其定义为自己的定义。

import scala.language.implicitConversions
object EnumImplicits {
    implicit def schema[E <: Enumeration](e: E): Schema[e.Value] = ???
}

然后,无论您在哪里需要访问该隐式,您只需使其可用import EnumImplicits._

这是一个例子

于 2022-01-13T13:01:09.997 回答