UNPKG

@nidomiro/relation-tuple-parser

Version:

[![npm version](https://badge.fury.io/js/@nidomiro%2Frelation-tuple-parser.svg)](https://www.npmjs.com/package/@nidomiro/relation-tuple-parser)

51 lines 2.44 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseRelationTuple = void 0; const defekt_1 = require("defekt"); const antlr4ts_1 = require("antlr4ts"); const RelationTupleLexer_1 = require("./generated/antlr/RelationTupleLexer"); const RelationTupleParser_1 = require("./generated/antlr/RelationTupleParser"); const relation_tuple_antlr_1 = require("./relation-tuple-antlr"); const relation_tuple_syntax_error_1 = require("./errors/relation-tuple-syntax.error"); const unknown_error_1 = require("./errors/unknown.error"); /** * Parses the given string to a {@link RelationTuple}. * str syntax: * ``` * <relation-tuple> ::= <object>'#'relation'@'<subject> | <object>'#'relation'@('<subject>')' * <object> ::= namespace':'object_id * <subject> ::= subject_id | <subject_set> * <subject_set> ::= <object>'#'relation * ``` * example: `object#relation@subject` * The characters `:@#()` are reserved for syntax use only (=> forbidden in values) * * @param str * @return The parsed {@link RelationTuple} or {@link RelationTupleSyntaxError} in case of an invalid string. */ const parseRelationTuple = (str) => { const trimmedStr = str.trim(); const inputStream = antlr4ts_1.CharStreams.fromString(trimmedStr); const lexer = new RelationTupleLexer_1.RelationTupleLexer(inputStream); const tokenStream = new antlr4ts_1.CommonTokenStream(lexer); const parser = new RelationTupleParser_1.RelationTupleParser(tokenStream); const parserErrorListener = new relation_tuple_antlr_1.MyParserErrorListener(trimmedStr); parser.removeErrorListeners(); parser.addErrorListener(parserErrorListener); const visitor = new relation_tuple_antlr_1.MyRelationTupleVisitor(); try { const parsedRelationTuple = visitor.visit(parser.relationTuple()); if (parserErrorListener.errors.length > 0) { return (0, defekt_1.error)(new relation_tuple_syntax_error_1.RelationTupleSyntaxError({ data: { errors: parserErrorListener.errors } })); } return (0, defekt_1.value)(parsedRelationTuple); } catch (e) { if (e instanceof relation_tuple_syntax_error_1.RelationTupleSyntaxError) { return (0, defekt_1.error)(e); } return (0, defekt_1.error)(new unknown_error_1.UnknownError({ data: e })); } }; exports.parseRelationTuple = parseRelationTuple; //# sourceMappingURL=relation-tuple-parser.js.map