Как получить protobuf.js для вывода строк перечисления вместо целых чисел

Я использую последний protobuf.js с Node.js 4.4.5.

Я в настоящее время изо всех сил пытаюсь получить protobuf.js вывести строковые определения перечислений вместо целых чисел. Я попробовал несколько предложений, но ни одно из них не сработало:

Я думаю, это из-за изменений API в protobuf.js для первого. Во втором случае я могу частично использовать предложенное решение, но если сообщение вложено в другие сообщения, сборщик, похоже, отступит от использования целочисленных значений, хотя строковые значения были явно установлены.

В идеале я хотел бы переписать функцию, которая используется для создания значений перечисления, но мне трудно найти правильную с помощью отладчика. Или есть лучший способ добиться этого для глубоко вложенных объектов?

2 ответа

Сгенерированный код JS из protoc имеет карту только в одном направлении, например

       proto.foo.Bar.Myenum = {
  HEY: 0,
  HO: 1
};

Обоснование этого здесь, но вам нужно выполнить обратный поиск в вашем собственном JS-коде. Для этого есть много простых решений. Я использовал тот, который находится на /questions/31622529/kak-poluchit-klyuch-v-karte-javascript-po-ego-znacheniyu/55301783#55301783 т.е.

Общая функция обратного картографирования ...

       export function getKey(map, val) {
  return Object.keys(map).find(key => map[key] === val);
}

UT ...

      import { Bar } from "js/proto/bar_pb";

expect(getKey(proto.foo.Bar.Myenum, 0)).toEqual("HEY");
expect(getKey(proto.foo.Bar.Myenum, 1)).toEqual("HO");
expect(getKey(proto.foo.Bar.Myenum, 99)).toBeUndefined();

Теперь вы можете использовать что-то вроде этого

      import { proto3 } from "@bufbuild/protobuf";

function get(v) {
    const texts = proto3.getEnumType(SomeEnumType).values.filter((v) => v.no === v);
    if (texts && texts.length > 0) {
      return texts[0].name;
    } else {
      return "Unknown";
    }
}
Другие вопросы по тегам