首页 > 解决方案 > 如何使用 scalapb 在 proto 中描述 Option[FiniteDuration]

问题描述

我正在尝试使用 proto3 和 scalapb,但我无法映射FiniteDuration也无法将其用作Option. 任何人都可以请同样的建议

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

标签: scalaprotocol-buffersscalapb

解决方案


假设您按照安装指南中的说明在 sbt 中配置了 scalabp

您需要为要转换的字段定义自定义类型int64,默认情况下映射为LongFiniteDuration

例如:

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

这将生成一个看起来您需要的案例类。

ScalaPB 将依赖隐式解析来编译它并应用从Longto 的映射FiniteDuration。为此,您需要在生成案例类的同一包中定义一个scalapb.TypeMapper[Long, FiniteDuration]in ,即.package objectmy.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)
}


推荐阅读