我正在尝试使用proto3和scalapb,但我无法映射FiniteDuration,也无法将其用作Option。有没有人能就此提个建议?
case class Message(id:Int , interval: Option[FiniteDuration])发布于 2021-11-14 21:05:06
假设您在sbt中按照installation guide中的描述配置了scalabp
您需要为要从int64 (默认情况下映射为Long )转换为FiniteDuration的字段定义custom type
例如:
syntax="proto3";
import "scalapb/scalapb.proto";
option java_package = "my.app.proto";
message Message {
int32 id = 1;
optional int64 interval = 2 [(scalapb.field).type = "scala.concurrent.duration.FiniteDuration"];
}这将生成一个看起来符合您需要的case类。
ScalaPB将依靠隐式解析来编译它,并应用从Long到FiniteDuration的映射。为此,您需要在生成case类的同一个包的package object中定义一个scalapb.TypeMapper[Long, FiniteDuration],即my.app.proto.message。
package my.app.proto
import scalapb.TypeMapper
import java.util.concurrent.TimeUnit
import scala.concurrent.duration.FiniteDuration
package object message {
implicit val finiteDuration: TypeMapper[Long, FiniteDuration] =
TypeMapper[Long, FiniteDuration](s => FiniteDuration.apply(s, TimeUnit.MILLISECONDS))(_.toMillis)
}https://stackoverflow.com/questions/69964897
复制相似问题