UNPKG

@abaplint/runtime

Version:
131 lines 3.96 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Character = void 0; const _parse_1 = require("../operators/_parse"); const throw_error_1 = require("../throw_error"); const field_symbol_1 = require("./field_symbol"); const structure_1 = require("./structure"); const integer_1 = require("./integer"); const TRIMREGEX = / *$/; const initialValues = {}; class Character { value; constant = false; length; extra; constructor(length, extra) { this.length = length || 1; if (typeof this.length === "object") { throw "Character, invalid length, object: " + JSON.stringify(this.length); } else if (this.length <= 0) { throw "Character, invalid length, less than zero"; } this.extra = extra; this.clear(); } clone() { const n = new Character(this.length, this.extra); // set without trigger checks and padding n.value = this.value; return n; } setConstant() { this.constant = true; return this; } set(value) { if (this.constant === true) { throw new Error("Changing constant"); } if (typeof value === "string") { this.value = value; } else if (typeof value === "number") { this.value = value + ""; } else if (value instanceof field_symbol_1.FieldSymbol) { if (value.getPointer() === undefined) { throw new Error("GETWA_NOT_ASSIGNED"); } this.set(value.getPointer()); return this; } else if (value instanceof structure_1.Structure) { this.set(value.getCharacter()); return this; } else if (value instanceof integer_1.Integer) { this.value = Math.abs(value.get()) + (value.get() < 0 ? "-" : " "); this.value = this.value.padStart(this.length, " "); } else { this.value = value.get() + ""; } if (this.value.length > this.length) { this.value = this.value.substr(0, this.length); } else if (this.value.length < this.length) { this.value = this.value.padEnd(this.length, " "); } return this; } getQualifiedName() { return this.extra?.qualifiedName; } getConversionExit() { return this.extra?.conversionExit; } getDDICName() { return this.extra?.ddicName; } getLength() { return this.length; } clear() { if (initialValues[this.length] === undefined) { initialValues[this.length] = " ".repeat(this.length); } this.value = initialValues[this.length]; } get() { return this.value; } getTrimEnd() { if (this.value.endsWith(" ") === true) { return this.value.replace(TRIMREGEX, ""); } else { return this.value; } } getOffset(input) { let offset = input?.offset; if (offset) { offset = (0, _parse_1.parse)(offset); } let length = input?.length; if (length) { length = (0, _parse_1.parse)(length); } if ((offset && offset >= this.length) || (length && length > this.length) || (offset && length && offset + length > this.length) || (offset && offset < 0) || (length && length < 0)) { (0, throw_error_1.throwError)("CX_SY_RANGE_OUT_OF_BOUNDS"); } let ret = this.value; if (offset) { ret = ret.substr(offset); } if (length !== undefined) { ret = ret.substr(0, length); } const r = new Character(ret.length); r.set(ret); return r; } } exports.Character = Character; //# sourceMappingURL=character.js.map