我的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伴随类中实现。
implicit val segmentType = TypeMapper[SegmentType, String](_.name)(SegmentType.fromName(_).get)
如何实现?还有一种方法可以将消息中的所有Enum
类型转换为String
吗?
答案 0 :(得分:1)
要获取编译器选择的隐式typemapper,可以将其放在与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.c
,a.b
或a
)。
对于第二个问题,您不能将所有枚举都设为字符串,但是可以使所有出现的给定枚举类型都为字符串,因此不必为每个字段分别指定自定义类型:< / p>
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]
}