@whisklabs/grpc
Version:
gRPC generator and http library for typescript
105 lines • 3.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parser = void 0;
var comment_1 = require("./comment");
var thrower_1 = require("./thrower");
var tokenizer_1 = require("./tokenizer");
var enums_1 = require("./tokens/enums");
var import_1 = require("./tokens/import");
var message_1 = require("./tokens/message");
var options_1 = require("./tokens/options");
var package_1 = require("./tokens/package");
var service_1 = require("./tokens/service");
var syntax_1 = require("./tokens/syntax");
var utils_1 = require("./utils");
function parse(tokens) {
var schema = {
syntax: 3,
imports: [],
enums: [],
messages: [],
options: {},
extends: [],
services: [],
};
(0, comment_1.cleanComment)();
(0, comment_1.setComment)(schema);
var first = true;
while (tokens.length > 0) {
switch ((0, comment_1.next)(tokens)) {
case 'syntax':
if (!first) {
throw new thrower_1.Thrower('syntax', [['must be on first line', 0]]);
}
schema.syntax = (0, syntax_1.ParseSyntax)(tokens);
break;
case 'package':
schema.package = (0, package_1.ParsePackage)(tokens);
break;
case 'message':
schema.messages.push((0, message_1.ParseMessage)(tokens));
break;
case 'import':
schema.imports.push((0, import_1.ParseImport)(tokens));
break;
case 'enum':
schema.enums.push((0, enums_1.ParseEnums)(tokens));
break;
case 'option': {
var _a = (0, options_1.ParseOptions)(tokens), field = _a.field, value = _a.value;
(0, utils_1.insertOption)(schema.options, field, value);
break;
}
case 'extend':
schema.extends.push((0, message_1.ParseExtend)(tokens));
break;
case 'service':
schema.services.push((0, service_1.ParseService)(tokens));
break;
default:
throw new thrower_1.Thrower('common', [["Unexpected token: ".concat(tokens[0]), 0]]);
}
first = false;
}
Extend(schema);
return schema;
}
function Extend(schema) {
for (var _i = 0, _a = schema.extends; _i < _a.length; _i++) {
var ext = _a[_i];
for (var _b = 0, _c = schema.messages; _b < _c.length; _b++) {
var msg = _c[_b];
if (msg.name === ext.name) {
if (msg.extensions.length === 0) {
throw new thrower_1.Thrower('extends', [["".concat(msg.name, " does not have extensions"), 0]]);
}
for (var _d = 0, _e = ext.message.fields; _d < _e.length; _d++) {
var field = _e[_d];
for (var _f = 0, _g = msg.extensions; _f < _g.length; _f++) {
var extension = _g[_f];
if (field.tag < extension.from || field.tag > extension.to) {
throw new thrower_1.Thrower('extends', [["".concat(msg.name, " does not declare ").concat(field.tag, " as an extension number"), 0]]);
}
msg.fields.push(field);
}
}
}
}
}
}
function parser(buf) {
var _a = (0, tokenizer_1.tokenizer)(buf.toString()), tokens = _a.tokens, lines = _a.lines, columns = _a.columns;
try {
return parse(tokens);
}
catch (e) {
if (e instanceof thrower_1.Thrower) {
e.addRange(tokens);
e.addLine(lines[lines.length - tokens.length]);
e.addColumn(columns[lines.length - tokens.length + e.message[0][1]]);
}
throw e;
}
}
exports.parser = parser;
//# sourceMappingURL=parser.js.map