"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SerdeOptions = exports.Stage = void 0; const case_1 = require("./case"); const utils_1 = require("./utils"); const registry_1 = require("./registry"); exports.Stage = Object.freeze({ Serialize: 0, Deserialize: 1 }); class SerdeOptions { get registry() { return this.options.registry || registry_1.GlobalRegistry; } constructor(options = {}, properties = new Map()) { Object.defineProperty(this, "target", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "options", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "properties", { enumerable: true, configurable: true, writable: true, value: void 0 }); this.options = options; this.properties = properties; } static from(target) { return new this(target); } getClassName(stage) { var _a, _b; if ((0, utils_1.isString)(this.options.rename)) { return this.options.rename; } else if (stage === exports.Stage.Serialize && (0, utils_1.isString)((_a = this.options.rename) === null || _a === void 0 ? void 0 : _a.serialize)) { return this.options.rename.serialize; } else if (stage === exports.Stage.Deserialize && (0, utils_1.isString)((_b = this.options.rename) === null || _b === void 0 ? void 0 : _b.deserialize)) { return this.options.rename.deserialize; } else { return this.target.constructor.name; } } getPropertyRename(property, stage, options) { var _a, _b; if (options != null) { 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; } } return property; } getPropertyCase(name, stage) { var _a, _b; if ((0, utils_1.isNumber)(this.options.renameAll)) { return (0, case_1.convertCase)(name, this.options.renameAll); } else if (stage === exports.Stage.Serialize && (0, utils_1.isNumber)((_a = this.options.renameAll) === null || _a === void 0 ? void 0 : _a.serialize)) { return (0, case_1.convertCase)(name, this.options.renameAll.serialize); } else if (stage === exports.Stage.Deserialize && (0, utils_1.isNumber)((_b = this.options.renameAll) === null || _b === void 0 ? void 0 : _b.deserialize)) { return (0, case_1.convertCase)(name, this.options.renameAll.deserialize); } else { return name; } } getPropertyName(property, stage) { const options = this.properties.get(property); const name = options != null ? this.getPropertyRename(property, stage, options) : property; return this.getPropertyCase(name, stage); } getSerializationName(property) { return this.getPropertyName(property, exports.Stage.Serialize); } getDeserializationName(property) { return this.getPropertyName(property, exports.Stage.Deserialize); } getDefault(property) { const options = this.properties.get(property); if (options && (0, utils_1.isFunction)(options.default)) { return options.default(); } else if ((0, utils_1.isFunction)(this.options.default)) { return this.options.default(); } } //getCustomImpl(property: string, stage: Stage) { // const options = this.properties.get(property) // if (options != null) { // if (stage === Stage.Serialize && isFunction(options.serializeWith)) { // return options.serializeWith // } else if (stage === Stage.Deserialize && isFunction(options.deserializeWith)) { // return options.deserializeWith // } // } //} //getSerializer(property: string): Nullable { // return this.getCustomImpl(property, Stage.Serialize) as CustomSerializer //} //getDeserializer(property: string): Nullable { // return this.getCustomImpl(property, Stage.Deserialize) as CustomDeserializer //} isConditionalSkip(skip) { return 'if' in skip && (0, utils_1.isFunction)(skip.if); } shouldSkip(property, value, stage) { const options = this.properties.get(property); if (options != null && options.skip != null) { if (typeof options.skip === 'boolean') { return options.skip; } else if (this.isConditionalSkip(options.skip)) { return options.skip.if(value); } else if (stage === exports.Stage.Serialize && typeof options.skip.serializing === 'boolean') { return options.skip.serializing; } else if (stage === exports.Stage.Serialize && this.isConditionalSkip(options.skip.serializing)) { return options.skip.serializing.if(value); } else if (stage === exports.Stage.Deserialize && typeof options.skip.deserializing === 'boolean') { return options.skip.deserializing; } else if (stage === exports.Stage.Deserialize && this.isConditionalSkip(options.skip.deserializing)) { return options.skip.deserializing.if(value); } } return false; } shouldSkipSerializing(property, value) { return this.shouldSkip(property, value, exports.Stage.Serialize); } shouldSkipDeserializing(property, value) { return this.shouldSkip(property, value, exports.Stage.Deserialize); } } exports.SerdeOptions = SerdeOptions;