如何使用 ScalaPB 将 protobuf Enum 生成为 String?

How to generate protobuf Enum as String using ScalaPB?

我的 Protobuf 消息中包含以下内容:

enum SegmentType {
     UNKNOWN = 0;
     TYPE_1 = 1;
     TYPE_2 = 2;
     TYPE_3 = 3;
        }
optional SegmentType segment_type = 1 [default = UNKNOWN]

而不是 GeneratedEnum 类型,我想生成一个字符串,并将值作为特定类型。例如

SegmentType: String = "TYPE_1"

link 解释了如何映射为自定义类型,但我不清楚如何映射为值类型。当我尝试以下操作时,ScalaPB 显示错误,它应该在 String companion class.

中实现
implicit val segmentType = TypeMapper[SegmentType, String](_.name)(SegmentType.fromName(_).get)

如何实现?还有一种方法可以将消息中的所有 Enum 类型转换为 String 吗?

要让编译器获取隐式类型映射器,您可以将它放在 SegmentType 所属的同一个包的包对象中。

假设你的原型有这样一个包声明:

package a.b.c.d;

然后在 Scala 中:

package a.b.c

package object d {
  implicit val segmentType =
    TypeMapper[SegmentType, String](_.name)(SegmentType.fromName(_).get)
}

您也可以将它放在 a.b.c.d 的任何父包中(例如 a.b.ca.ba)。

关于你的第二个问题,你不能让所有的枚举都是字符串,但是你可以让所有出现的给定枚举类型都是字符串,这样你就不必为每个字段单独指定自定义类型:

enum SegmentType {
     option (scalapb.enum_options).type = "String";
     UNKNOWN = 0;
     TYPE_1 = 1;
     TYPE_2 = 2;
     TYPE_3 = 3;
}

message F {
  optional SegmentType segment_type = 1; // will be an Option[String]
}