Как получить 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";
}
}