"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SerdeOptions = exports.Stage = void 0; const case_1 = require("../case"); const utils_1 = require("../utils"); exports.Stage = Object.freeze({ Serialize: 0, Deserialize: 1 }); class SerdeOptions { constructor(target, container = {}, properties = new Map()) { Object.defineProperty(this, "target", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "container", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "properties", { enumerable: true, configurable: true, writable: true, value: void 0 }); this.target = target; this.container = container; this.properties = properties; } getClassName(stage, defaultName) { var _a, _b, _c, _d; if (defaultName === void 0) { defaultName = (_b = (_a = this.target) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name; } if ((0, utils_1.isString)(this.container.rename)) { return this.container.rename; } else if (stage === exports.Stage.Serialize && (0, utils_1.isString)((_c = this.container.rename) === null || _c === void 0 ? void 0 : _c.serialize)) { return this.container.rename.serialize; } else if (stage === exports.Stage.Deserialize && (0, utils_1.isString)((_d = this.container.rename) === null || _d === void 0 ? void 0 : _d.deserialize)) { return this.container.rename.serialize; } else { return defaultName; } } getSerializedClassName(defaultName) { var _a, _b; if (defaultName === void 0) { defaultName = (_b = (_a = this.target) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name; } return this.getClassName(exports.Stage.Serialize, defaultName); } getDeserializedClassName(defaultName) { var _a, _b; if (defaultName === void 0) { defaultName = (_b = (_a = this.target) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name; } return this.getClassName(exports.Stage.Deserialize, defaultName); } applyPropertyCase(stage, property) { var _a, _b; if ((0, utils_1.isNumber)(this.container.renameAll)) { return (0, case_1.convertCase)(property, this.container.renameAll); } else if (stage === exports.Stage.Serialize && (0, utils_1.isNumber)((_a = this.container.renameAll) === null || _a === void 0 ? void 0 : _a.serialize)) { return (0, case_1.convertCase)(property, this.container.renameAll.serialize); } else if (stage === exports.Stage.Deserialize && (0, utils_1.isNumber)((_b = this.container.renameAll) === null || _b === void 0 ? void 0 : _b.deserialize)) { return (0, case_1.convertCase)(property, this.container.renameAll.deserialize); } else { return property; } } getPropertyName(stage, property) { var _a, _b; const options = this.properties.get(property); if (options == null) { return property; } else if ((0, utils_1.isString)(options.rename)) { return options.rename; } else if (stage == exports.Stage.Serialize && (0, utils_1.isString)((_a = options.rename) === null || _a === void 0 ? void 0 : _a.serialize)) { return options.rename.serialize; } else if (stage == exports.Stage.Deserialize && (0, utils_1.isString)((_b = options.rename) === null || _b === void 0 ? void 0 : _b.deserialize)) { return options.rename.deserialize; } else { return property; } } getSerializationPropertyName(property) { const name = this.getPropertyName(exports.Stage.Serialize, property); return this.applyPropertyCase(exports.Stage.Serialize, name); } getDeserializationPropertyName(property) { const name = this.getPropertyName(exports.Stage.Deserialize, property); return this.applyPropertyCase(exports.Stage.Deserialize, name); } shouldSkip(stage, property, value) { var _a, _b, _c, _d; const options = this.properties.get(property); if (options == null) { return false; } else if (typeof options.skip === 'boolean') { return options.skip; } else if ((0, utils_1.isFunction)(options.skip)) { return options.skip(value); } else if (stage === exports.Stage.Serialize && typeof ((_a = options.skip) === null || _a === void 0 ? void 0 : _a.serialize) === 'boolean') { return options.skip.serialize; } else if (stage === exports.Stage.Serialize && (0, utils_1.isFunction)((_b = options.skip) === null || _b === void 0 ? void 0 : _b.serialize)) { return options.skip.serialize(value); } else if (stage === exports.Stage.Deserialize && typeof ((_c = options.skip) === null || _c === void 0 ? void 0 : _c.deserialize) === 'boolean') { return options.skip.deserialize; } else if (stage === exports.Stage.Deserialize && (0, utils_1.isFunction)((_d = options.skip) === null || _d === void 0 ? void 0 : _d.deserialize)) { return options.skip.deserialize(value); } else { return false; } } shouldSerialize(property, value) { return !this.shouldSkip(exports.Stage.Serialize, property, value); } shouldDeserialize(property, value) { return !this.shouldSkip(exports.Stage.Deserialize, property, value); } defaultFor(property) { const options = this.properties.get(property); if (options != null && (0, utils_1.isFunction)(options.default)) { return options.default(); } else if ((0, utils_1.isFunction)(this.container.default)) { return this.container.default(); } } } exports.SerdeOptions = SerdeOptions;