@kodeko/akita-core
Version:
A powerfull string interpreter
270 lines (269 loc) • 14 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Interpreter = void 0;
var tslib_1 = require("tslib");
var lexer_1 = require("./lexer");
var lodash_1 = require("lodash");
var util_1 = tslib_1.__importStar(require("./util"));
var __1 = require("..");
var reader_1 = require("./reader");
var util_2 = require("util");
var Interpreter = (function () {
function Interpreter(options) {
this.options = options;
this.reader = new reader_1.Reader(this);
this.lexer = new lexer_1.Lexer(options === null || options === void 0 ? void 0 : options.lexer);
this.lexer.set_functions(Interpreter.functions
.map(function (abs) {
var r = [abs.name];
abs.name_in && r.push(abs.name_in);
return r;
})
.flat(1));
}
Interpreter.prototype.solve_fields = function (data, saf, i, s, e) {
if (s === void 0) { s = 0; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var index;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if ((0, lodash_1.isNil)(saf.fields) || (0, lodash_1.isEmpty)(saf.fields))
return [2, saf];
index = s;
_a.label = 1;
case 1:
if (!(index < saf.fields.length)) return [3, 4];
if (e === index)
return [3, 4];
if (i && i.includes(index))
return [3, 3];
return [4, this.solve_field(data, saf, index)];
case 2:
saf = _a.sent();
_a.label = 3;
case 3:
index++;
return [3, 1];
case 4: return [2, saf];
}
});
});
};
Interpreter.prototype.solve_field = function (data, saf, index) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var bass, _loop_1, this_1, _i, _a, overload;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
if ((0, lodash_1.isNil)(saf.fields) || (0, lodash_1.isEmpty)(saf.fields) || (0, lodash_1.isNil)(saf.fields[index]))
return [2, saf];
bass = data;
_loop_1 = function (overload) {
var finded, reject, results;
return tslib_1.__generator(this, function (_c) {
switch (_c.label) {
case 0:
data.input = saf.fields[index].value;
finded = Interpreter.functions.find(function (n) { return n.name_in === overload.name || n.name === overload.name; });
return [4, finded.solve.apply(this_1, [overload, data])];
case 1:
reject = _c.sent();
if (reject.input) {
results = reject.input.match(lexer_1.Lexer.SAR_EXPRESSION);
if (results) {
if (reject.input === results[0])
saf.fields[index].value = data.results[results[0]];
else
saf.fields[index].value = util_1.default.interpolate_strig(reject.input, data);
}
else
saf.fields[index].value = reject.input;
}
return [2];
}
});
};
this_1 = this;
_i = 0, _a = saf.fields[index].overloads;
_b.label = 1;
case 1:
if (!(_i < _a.length)) return [3, 4];
overload = _a[_i];
return [5, _loop_1(overload)];
case 2:
_b.sent();
_b.label = 3;
case 3:
_i++;
return [3, 1];
case 4:
data.input = bass.input;
return [2, saf];
}
});
});
};
Interpreter.add_functions = function () {
var abs_based_functions = [];
for (var _i = 0; _i < arguments.length; _i++) {
abs_based_functions[_i] = arguments[_i];
}
for (var _a = 0, abs_based_functions_1 = abs_based_functions; _a < abs_based_functions_1.length; _a++) {
var abs_based_function = abs_based_functions_1[_a];
var abs = new abs_based_function();
Interpreter.functions.push(abs);
}
};
Interpreter.load_core_functions = function (cb) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4, this.load_functions(__1.akita_functions_mod, cb)];
case 1:
_a.sent();
return [2];
}
});
});
};
Interpreter.load_functions = function (mod, cb) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _i, _a, file, abs, error_1;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
_i = 0, _a = util_1.default.get_files(mod).filter(function (el) {
return el.name.endsWith(".js");
});
_b.label = 1;
case 1:
if (!(_i < _a.length)) return [3, 8];
file = _a[_i];
_b.label = 2;
case 2:
_b.trys.push([2, 6, , 7]);
return [4, Promise.resolve().then(function () { return tslib_1.__importStar(require(file.name)); })];
case 3:
abs = new (_b.sent()).default();
if (!cb) return [3, 5];
return [4, cb(abs)];
case 4:
abs = _b.sent();
_b.label = 5;
case 5:
this.functions.push(abs);
return [3, 7];
case 6:
error_1 = _b.sent();
console.log("\u001b[31mThere was an error loading %s\n%s\u001b[0m", file.name, error_1.message);
return [3, 7];
case 7:
_i++;
return [3, 1];
case 8: return [2];
}
});
});
};
Interpreter.prototype.resolve = function (data, saf, rpr) {
var res_id = "SAR(".concat(saf.uid, ")");
data.input = data.input.replace(saf.identifier, res_id);
data.results[res_id] = rpr;
};
Interpreter.prototype.solve = function (input, options, data, debug) {
var _a, _b;
if (debug === void 0) { debug = false; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _c, linput, block, _loop_2, this_2, _i, block_1, saf;
return tslib_1.__generator(this, function (_d) {
switch (_d.label) {
case 0:
if (((0, lodash_1.isObject)(debug) && debug.gived_input) || debug === true)
console.log("\u001B[44m[ DEBUG ]\u001B[0m Gived Input \u001B[90m".concat(new Date().toLocaleString(), "\n\u001B[31m%s\u001B[0m\n"), input);
_c = this.lexer.lex(input, options, (0, lodash_1.isObject)(debug) ? debug.lexer : debug), linput = _c.input, block = _c.block;
input = linput;
if (((0, lodash_1.isObject)(debug) && debug.parsed_input) || debug === true)
console.log("\u001B[44m[ DEBUG ]\u001B[0m Parsed \u001B[90m".concat(new Date().toLocaleString(), "\n\u001B[31m%s\u001B[0m\n"), input);
(0, lodash_1.merge)(data, {
results: {},
parents: [],
extra: {
variables: {},
},
epd: null,
input: input,
});
if (((0, lodash_1.isObject)(debug) && debug.executions) || debug === true)
console.log("\u001B[44m[ DEBUG ]\u001B[0m Executions \u001B[90m".concat(new Date().toLocaleString(), "\u001B[34m"));
_loop_2 = function (saf) {
var finded, error_2;
return tslib_1.__generator(this, function (_e) {
switch (_e.label) {
case 0:
finded = Interpreter.functions.find(function (f) { return f.name_in === saf.name || f.name === saf.name; });
if ((0, lodash_1.isNil)(finded))
return [2, "continue"];
if (saf.prototype) {
if (!finded.prototypes.includes(saf.prototype))
throw new util_1.AkitaError("".concat(saf.name, " doesn't have the prototype \"").concat(saf.prototype, "\""));
else if (finded.prototypes.length === 0)
throw new util_1.AkitaError("".concat(saf.name, " doesn't have prototypes"));
}
if (finded.type === "parent")
(_a = data.parents) === null || _a === void 0 ? void 0 : _a.push(finded.name_in || finded.name);
_e.label = 1;
case 1:
_e.trys.push([1, 3, , 7]);
return [4, finded.solve.apply(this_2, [saf, data])];
case 2:
data = _e.sent();
return [3, 7];
case 3:
error_2 = _e.sent();
if (!(finded.name_in === "akita-core:try")) return [3, 5];
data.extra.error = error_2;
return [4, finded.solve.apply(this_2, [saf, data])];
case 4:
data = _e.sent();
return [3, 6];
case 5: throw error_2;
case 6: return [3, 7];
case 7:
finded.type === "parent" && ((_b = data.parents) === null || _b === void 0 ? void 0 : _b.pop());
data.epd = null;
return [2];
}
});
};
this_2 = this;
_i = 0, block_1 = block;
_d.label = 1;
case 1:
if (!(_i < block_1.length)) return [3, 4];
saf = block_1[_i];
return [5, _loop_2(saf)];
case 2:
_d.sent();
_d.label = 3;
case 3:
_i++;
return [3, 1];
case 4:
if (((0, lodash_1.isObject)(debug) && debug.executions) || debug === true)
console.log("\u001b[0m\n");
if (((0, lodash_1.isObject)(debug) && debug.final) || debug === true) {
console.log("\u001B[44m[ DEBUG ]\u001B[0m Final \u001B[90m".concat(new Date().toLocaleString(), "\n\u001B[0m%s\n"), (0, util_2.inspect)(data, {
depth: (0, lodash_1.isObject)(debug) && (0, lodash_1.isObject)(debug.final) ? debug.final.depth : null,
colors: true,
}));
}
return [2, data];
}
});
});
};
Interpreter.functions = [];
return Interpreter;
}());
exports.Interpreter = Interpreter;