如何用 scalapb 在 proto 中描述 Option[FiniteDuration]

How to describe Option[FiniteDuration] in proto with scalapb

我正在尝试使用 proto3 和 scalapb,但我无法映射 FiniteDuration 也无法将其用作 Option。任何人都可以就此提出建议

case class Message(id:Int , interval: Option[FiniteDuration])

鉴于您已按照 installation guide

中所述在 sbt 中配置了 scalabp

您需要为要从 int64 转换的字段定义一个 custom type,默认映射为 Long,到 FiniteDuration

例如:

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"];
}

这将生成一个符合您需要的案例class。

ScalaPB 将依赖隐式解析来编译它并应用从 LongFiniteDuration 的映射。为此,您需要在生成案例 class 的同一包的 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)
}