如何用 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 将依赖隐式解析来编译它并应用从 Long
到 FiniteDuration
的映射。为此,您需要在生成案例 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)
}
我正在尝试使用 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 将依赖隐式解析来编译它并应用从 Long
到 FiniteDuration
的映射。为此,您需要在生成案例 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)
}