如何使用ScalaPB生成protobuf枚举作为字符串?

时间:2019-05-15 20:31:13

标签: protocol-buffers 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伴随类中实现。

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

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

1 个答案:

答案 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.ca.ba)。

对于第二个问题,您不能将所有枚举都设为字符串,但是可以使所有出现的给定枚举类型都为字符串,因此不必为每个字段分别指定自定义类型:< / 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]
}