@noggin/elastic-noggin-sdk
Version:
Elastic Noggin SDK
160 lines (159 loc) • 6.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.WriteTemplateAny = exports.WriteTemplate = exports.ParseTemplateAny = exports.ParseTemplate = exports.IsFormulaSpec = exports.QuoteString = exports.Stringify = exports.Parser = void 0;
const formula_lexer_1 = require("./formula-lexer");
const lodash_1 = require("lodash");
let parser;
function parserFactory() {
const newParser = new formula_lexer_1.Parser();
newParser.yy = {
handler: {
helper: {
number: function (num) {
switch (typeof num) {
case 'number':
return num;
case 'string':
if (!isNaN(num)) {
return num.indexOf('.') > -1 ? parseFloat(num) : parseInt(num, 10);
}
}
return num;
},
numberInverted: function (num) {
return this.number(num) * (-1);
},
string: function (str) {
return str.substring(1, str.length - 1).replace(/\\"/g, '"');
},
callFunction: function (funcName, args = []) {
return { name: funcName.toUpperCase(), args: args };
}
}
}
};
return newParser;
}
function Parser(formulaStr) {
if (!parser) {
parser = parserFactory();
}
return parser.parse(formulaStr);
}
exports.Parser = Parser;
function Stringify(formula) {
if (typeof formula === 'string') {
return QuoteString(formula);
}
if (typeof formula === 'number') {
return isNaN(formula) ? '' : formula.toString();
}
const spec = formula;
const argStrs = spec.args.map(Stringify);
return spec.name + '(' + argStrs.join(',') + ')';
}
exports.Stringify = Stringify;
function QuoteString(str) {
return '"' + str.replace(/\\/g, '\\\\').replace(/"/g, '\\"') + '"';
}
exports.QuoteString = QuoteString;
function IsFormulaSpec(formula) {
return typeof formula !== 'string' && typeof formula !== 'number';
}
exports.IsFormulaSpec = IsFormulaSpec;
function ParseTemplate(formula, template) {
const result = {};
if (formula.name !== template.name) {
parseTemplateErr(formula, template, 'Unexpected formula name');
}
if (formula.args.length !== template.args.length) {
parseTemplateErr(formula, template, 'Argument length different');
}
for (let i = 0; i < template.args.length; i++) {
if (typeof template.args[i] === 'string' && template.args[i].substr(0, 1) === '$') {
if (IsFormulaSpec(formula.args[i])) {
parseTemplateErr(formula, template, 'Expected static value for argument ' + (1 + i));
}
else {
result[template.args[i]] = formula.args[i];
}
}
else if (!IsFormulaSpec(template.args[i])) {
if (formula.args[i] !== template.args[i]) {
parseTemplateErr(formula, template, 'Unexpected value argument ' + (1 + i));
}
}
else {
if (IsFormulaSpec(formula.args[i])) {
(0, lodash_1.merge)(result, ParseTemplate(formula.args[i], template.args[i]));
}
else {
const subFormulaName = template.args[i].name;
parseTemplateErr(formula, template, 'Expected ' + subFormulaName + ' formula for argument ' + (1 + i));
}
}
}
return result;
}
exports.ParseTemplate = ParseTemplate;
function ParseTemplateAny(formula, template) {
const result = {};
if (formula.name !== template.name) {
parseTemplateErr(formula, template, 'Unexpected formula name');
}
if (formula.args.length !== template.args.length) {
parseTemplateErr(formula, template, 'Argument length different');
}
for (let i = 0; i < template.args.length; i++) {
if (typeof template.args[i] === 'string' && template.args[i].substr(0, 1) === '$') {
result[template.args[i]] = formula.args[i];
}
else if (!IsFormulaSpec(template.args[i])) {
if (formula.args[i] !== template.args[i]) {
parseTemplateErr(formula, template, 'Unexpected value argument ' + (1 + i));
}
}
else {
if (IsFormulaSpec(formula.args[i])) {
(0, lodash_1.merge)(result, ParseTemplateAny(formula.args[i], template.args[i]));
}
else {
const subFormulaName = template.args[i].name;
parseTemplateErr(formula, template, 'Expected ' + subFormulaName + ' formula for argument ' + (1 + i));
}
}
}
return result;
}
exports.ParseTemplateAny = ParseTemplateAny;
function parseTemplateErr(formula, template, message) {
throw new Error('Does not conform to formula template: ' + message + ': ' + Stringify(formula) + ' != ' + Stringify(template));
}
function WriteTemplate(template, inserts) {
const formula = { name: template.name, args: [] };
formula.args = template.args.map(arg => {
if (IsFormulaSpec(arg)) {
return WriteTemplate(arg, inserts);
}
if (typeof arg === 'string' && arg.substr(0, 1) === '$') {
return inserts.hasOwnProperty(arg) ? inserts[arg] : { name: 'ARRAY', args: [] };
}
return arg;
});
return formula;
}
exports.WriteTemplate = WriteTemplate;
function WriteTemplateAny(template, inserts) {
const formula = { name: template.name, args: [] };
formula.args = template.args.map(arg => {
if (IsFormulaSpec(arg)) {
return WriteTemplateAny(arg, inserts);
}
if (typeof arg === 'string' && arg.substr(0, 1) === '$') {
return inserts.hasOwnProperty(arg) ? inserts[arg] : { name: 'ARRAY', args: [] };
}
return arg;
});
return formula;
}
exports.WriteTemplateAny = WriteTemplateAny;