@whisklabs/grpc
Version:
gRPC generator and http library for typescript
120 lines • 4.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ParseMessage = exports.MessageBody = exports.ParseExtend = void 0;
var typeguards_1 = require("@whisklabs/typeguards");
var comment_1 = require("../comment");
var thrower_1 = require("../thrower");
var utils_1 = require("../utils");
var validators_1 = require("../validators");
var enums_1 = require("./enums");
var extensions_1 = require("./extensions");
var field_1 = require("./field");
var oneof_1 = require("./oneof");
var options_1 = require("./options");
var reserved_1 = require("./reserved");
function ParseExtend(tokens) {
return {
name: tokens[1],
message: ParseMessage(tokens),
};
}
exports.ParseExtend = ParseExtend;
function MessageBody(tokens, name) {
var message = {
name: name,
enums: [],
options: {},
messages: [],
fields: [],
extends: [],
extensions: [],
reserved: [],
};
(0, comment_1.writeComment)(message);
while (tokens.length > 0) {
switch ((0, comment_1.next)(tokens)) {
case '}':
tokens.shift();
(0, comment_1.writeComment)(message);
CheckReserved(message);
return message;
case 'map':
case 'repeated':
case 'optional':
case 'required':
message.fields.push((0, field_1.ParseField)(tokens));
break;
case 'enum':
message.enums.push((0, enums_1.ParseEnums)(tokens));
break;
case 'message':
message.messages.push(ParseMessage(tokens));
break;
case 'extensions':
message.extensions.push((0, extensions_1.ParseExtensions)(tokens));
break;
case 'oneof':
message.fields = message.fields.concat((0, oneof_1.ParseOneOf)(tokens));
break;
case 'extend':
message.extends.push(ParseExtend(tokens));
break;
case ';':
tokens.shift();
break;
case 'reserved':
message.reserved.push((0, reserved_1.ParseReserved)(tokens));
break;
case 'option': {
var _a = (0, options_1.ParseOptions)(tokens), field = _a.field, value = _a.value;
(0, utils_1.insertOption)(message.options, field, value);
break;
}
case undefined:
continue;
default:
message.fields.push((0, field_1.ParseField)(tokens, true));
}
}
throw new thrower_1.Thrower('message', [['no close tag "}"', 0]]);
}
exports.MessageBody = MessageBody;
function CheckReserved(message) {
for (var _i = 0, _a = message.reserved; _i < _a.length; _i++) {
var reserved = _a[_i];
for (var _b = 0, reserved_2 = reserved; _b < reserved_2.length; _b++) {
var reserve = reserved_2[_b];
for (var _c = 0, _d = message.fields; _c < _d.length; _c++) {
var field = _d[_c];
if ((0, validators_1.isText)(reserve) && reserve === field.name) {
throw new thrower_1.Thrower('reserved', [["Field name \"".concat(field.name, "\" in message \"").concat(message.name, "\" is reserved"), 0]]);
}
else if ((0, validators_1.isNumber)(reserve) && reserve === field.tag) {
throw new thrower_1.Thrower('reserved', [
["Field \"".concat(field.name, "\" in message \"").concat(message.name, "\" with tag \"").concat(field.tag, "\" is reserved"), 0],
]);
}
else if ((0, typeguards_1.isObject)(reserve) && reserve.from <= field.tag && field.tag <= reserve.to) {
throw new thrower_1.Thrower('reserved', [
[
// eslint-disable-next-line max-len
"Field \"".concat(field.name, "\" with tag \"").concat(field.tag, "\" in message \"").concat(message.name, "\" is reserved between ").concat(reserve.from, " to ").concat(reserve.to),
0,
],
]);
}
}
}
}
}
function ParseMessage(tokens) {
var len = (0, utils_1.check)({
type: 'message',
tokens: [tokens[0], tokens[1], tokens[2], tokens[tokens.indexOf('}')]],
rules: [(0, utils_1.ch)(['extend', 'message']), (0, utils_1.ch)(validators_1.isText), (0, utils_1.ch)('{'), (0, utils_1.ch)('}')],
}).len;
var _a = (0, utils_1.cut)(tokens, len - 1), messageName = _a[1];
return MessageBody(tokens, messageName);
}
exports.ParseMessage = ParseMessage;
//# sourceMappingURL=message.js.map