Как сгенерировать protobuf Enum как String, используя ScalaPB? - PullRequest
0 голосов
/ 15 мая 2019

В моем сообщении 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"

Эта ссылка объясняет, как отобразить как пользовательский тип, но мне не ясно, как отобразить как тип значения.Когда я пытаюсь сделать следующее, ScalaPB выдает ошибку, что это должно быть реализовано в классе-компаньоне String.

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

Как мне этого добиться?Также есть ли способ преобразовать все Enum типы в сообщении в String?

1 Ответ

1 голос
/ 16 мая 2019

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