Protocol buffers 如何使用ScalaPB将protobuf Enum生成为字符串?

Protocol buffers 如何使用ScalaPB将protobuf Enum生成为字符串?,protocol-buffers,scalapb,Protocol Buffers,Scalapb,我的Protobuf消息中包含以下内容: enum SegmentType { UNKNOWN = 0; TYPE_1 = 1; TYPE_2 = 2; TYPE_3 = 3; } optional SegmentType segment_type = 1 [default = UNKNOWN] 我想生成一个字符串,将value作为特定类型,而不是GeneratedEnumtype。比如说 SegmentType: String = "T

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

enum SegmentType {
     UNKNOWN = 0;
     TYPE_1 = 1;
     TYPE_2 = 2;
     TYPE_3 = 3;
        }
optional SegmentType segment_type = 1 [default = UNKNOWN]
我想生成一个字符串,将value作为特定类型,而不是
GeneratedEnum
type。比如说

SegmentType: String = "TYPE_1"
这解释了如何映射为自定义类型,但我不清楚如何映射为值类型。当我尝试以下操作时,ScalaPB显示了一个错误,即它应该在String companion类中实现

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

我怎样才能做到呢?还有一种方法可以将消息中的所有
Enum
类型转换为
String

要获取编译器拾取的隐式类型映射器,可以将其放入所属的相同包
SegmentType
的包对象中

假设您的proto有一个包语句,如下所示:

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.c
a.b
a

对于第二个问题,您不能将所有枚举都设置为字符串,但可以将给定枚举类型的所有匹配项设置为字符串,因此不必单独为每个字段指定自定义类型:

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

成功了!如果您也将其添加到ScalaPB文档中,那就太好了!伟大的在结尾添加了一段