@nidomiro/relation-tuple-parser
Version:
[](https://www.npmjs.com/package/@nidomiro/relation-tuple-parser)
51 lines • 2.44 kB
JavaScript
;
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