odatafy-parser
Version:
generate odatafy ast from odata query parameters
47 lines (45 loc) • 2.1 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const peggy_1 = __importDefault(require("peggy"));
const filterAstPostProc_1 = __importDefault(require("../processing/filterAstPostProc"));
const filterExpressionPreProc_1 = __importDefault(require("../processing/filterExpressionPreProc"));
const errors_1 = require("../types/errors");
const nodes_1 = require("../types/nodes");
const utils_1 = require("../utils");
//import astPostProc from '../processing/astPostProc';
const filterParser_1 = require("./filterParser");
const computeParser = peggy_1.default.generate(filterParser_1.filterGrammar +
`
start = head:computeItem tail:( COMMA @computeItem )* {return{nodeType: "ComputeNode", computeProps: [head, ...tail]}}
computeItem = commonExpr:(commonExpr / value:$mathExpr {return {type: 'mathExpr', value: value}} / odataIdentifier) RWS "as" RWS computeIdentifier:$odataIdentifier {return {nodeType: "ComputeItemNode", commonExpr:commonExpr, computeIdentifier: computeIdentifier}}
`, { allowedStartRules: ['start'] });
function parseCompute(expr) {
const computeNode = {
nodeType: nodes_1.NodeTypes.ComputeNode,
value: []
};
try {
expr = (0, filterExpressionPreProc_1.default)(expr);
const ast = computeParser.parse(expr);
ast.computeProps.forEach((computeItem) => {
computeItem.commonExpr = (0, filterAstPostProc_1.default)(computeItem.commonExpr);
computeNode.value.push(computeItem);
});
return computeNode;
}
catch (e) {
throw (0, utils_1.getOdatafyParserError)('malformed compute expression', errors_1.OdatafyQueryOptions.Compute);
}
}
exports.default = {
/**
* Parser for compute expressions
* @param expr compute expression as string
* @example computeParser.parse("FirstName as Name")
* @returns Abstract Syntax Tree (AST) of type ComputeNode
*/
parse: parseCompute
};