Чтобы получить неявный компоновщик, подобранный компилятором, вы можете поместить его в объект пакета для того же пакета, к которому принадлежит 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]
}