我的域名如下:
package object tryme {
type ALL = AlarmMessage :+: PassMessage :+: HeyMessage :+: CNil
}
import com.tryme._
trait PayloadKind
trait Command extends PayloadKind
trait Event extends PayloadKind
trait Message[+T <: PayloadKind] {
val id: String
val payload: T
}
case class Alarm(severity: Int) extends Event
case class Pass(reason: String) extends Event
case class Hey(order: String) extends Command
case class AlarmMessage(id: String, payload: Alarm) extends Message[Event]
case class PassMessage(id: String, payload: Pass) extends Message[Event]
case class HeyMessage(id: String, payload: Hey) extends Message[Command]
case class AvroMessage(
id: String,
cargo: ALL
)
如果我使用cargo = HeyMessage创建AvroMessage,我可以成功序列化/反序列化。
当我检查反序列化的AvroMessage对象的货场时,它看起来像这样:
Inr(Inr(Inl(HeyMessage(art333,Hey(wow)))))
在Shapeless中,我如何打开/剥离所有Inr / Inls?理想情况下,我不想关心(发布反序列化)有效负载是HeyMessage(或任何其他类型),如果我可以避免它。我打算将货物投入Message [PayloadKind],但首先我需要打开它。
(我看到了类似问题的答案here,但我承认我不明白它是如何运作的,并且无法适应它。)
答案 0 :(得分:1)
您可以使用>>>df
rtt requests
asn
1000 40 100
2000 50 NaN
3000 60 300
shapeless.ops.coproduct.Selector
结果为val coproduct = Inr(Inr(Inl(HeyMessage(art333, Hey(wow)))))
Selector[ALL, HeyMessage].apply(coproduct).get
。
答案 1 :(得分:1)
您可以使用syntax
子包中的扩展方法:
import shapeless.syntax._
// select returns an Option
coproduct.select[HeyMessage].get