如何使用 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.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]
}
我的 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.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]
}