Scala avro4s,为共同特征定义 SchemaFor?

问题描述 投票:0回答:1

我正在尝试为一个共同特征定义一个 avro4s 模式派生。示例

trait Event
case class UserCreated(name: String, age: Int) extends Event
case class UserDeleted(reason: String) extends Event

具体类的推导似乎很简单:

given userCreatedSchemaFor = SchemaFor[UserCreated]
given userDeletedSchemaFor = SchemaFor[UserDeleted]

我很想实现这样的假代码:

given eventSchemaFor = new SchemaFor[Event] { 
  CASE (userCreated) => USE userCreatedSchemaFor
  CASE (userDeleted) => USE userDeletedSchemaFor
}

SchemaFor 特征和对象公开了一些应用变体和“工厂”方法,但我无法找到将它们用于我的目的的方法。感谢您的帮助。

scala typeclass avro4s
1个回答
0
投票
如果您可以密封您的特征,

sealed trait

开箱即用地支持层次结构(请参阅
此表中的内置类型映射)以及关于这些此处的更多注释。

以下内容按预期工作,无需任何进一步干预:

import com.sksamuel.avro4s.SchemaFor sealed trait Event case class UserCreated(name: String, age: Int) extends Event case class UserDeleted(reason: String) extends Event val schemaForEvent = SchemaFor[Event] val schemaForUserCreated = SchemaFor[UserCreated] val schemaForUserDeleted = SchemaFor[UserDeleted]
您可以在 

Scastie 上使用此代码

© www.soinside.com 2019 - 2024. All rights reserved.