"use strict";
/**
 * Copyright (C) 2016-2020 Michael Kourlas
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.WrapHandlers = exports.TypeHandlers = exports.FormatOptions = exports.DtdOptions = exports.DeclarationOptions = exports.Options = void 0;
var utils_1 = require("./utils");
/**
 * Implementation of the IOptions interface used to provide default values
 * to fields.
 */
var Options = /** @class */ (function () {
    function Options(options) {
        if (options === void 0) { options = {}; }
        this.aliasString = "=";
        this.attributeString = "@";
        this.cdataInvalidChars = false;
        this.cdataKeys = [];
        this.replaceInvalidChars = false;
        this.useSelfClosingTagIfEmpty = true;
        this.validation = true;
        this.valueString = "#";
        if (!(0, utils_1.isUndefined)(options.validation)) {
            this.validation = options.validation;
        }
        if (!(0, utils_1.isUndefined)(options.aliasString)) {
            this.aliasString = options.aliasString;
        }
        if (!(0, utils_1.isUndefined)(options.attributeString)) {
            this.attributeString = options.attributeString;
        }
        if (!(0, utils_1.isUndefined)(options.cdataInvalidChars)) {
            this.cdataInvalidChars = options.cdataInvalidChars;
        }
        if (!(0, utils_1.isUndefined)(options.cdataKeys)) {
            this.cdataKeys = options.cdataKeys;
        }
        this.declaration = new DeclarationOptions(options.declaration);
        this.dtd = new DtdOptions(this.validation, options.dtd);
        this.format = new FormatOptions(options.format);
        if (!(0, utils_1.isUndefined)(options.replaceInvalidChars)) {
            this.replaceInvalidChars = options.replaceInvalidChars;
        }
        this.typeHandlers = new TypeHandlers(options.typeHandlers);
        if (!(0, utils_1.isUndefined)(options.useSelfClosingTagIfEmpty)) {
            this.useSelfClosingTagIfEmpty = options.useSelfClosingTagIfEmpty;
        }
        if (!(0, utils_1.isUndefined)(options.valueString)) {
            this.valueString = options.valueString;
        }
        this.wrapHandlers = new WrapHandlers(options.wrapHandlers);
    }
    return Options;
}());
exports.Options = Options;
/**
 * Implementation of the IDeclarationOptions interface used to provide default
 * values to fields.
 */
var DeclarationOptions = /** @class */ (function () {
    function DeclarationOptions(declarationOptions) {
        if (declarationOptions === void 0) { declarationOptions = {}; }
        this.include = true;
        if (!(0, utils_1.isUndefined)(declarationOptions.include)) {
            this.include = declarationOptions.include;
        }
        // Validation performed by xmlcreate
        this.encoding = declarationOptions.encoding;
        this.standalone = declarationOptions.standalone;
        this.version = declarationOptions.version;
    }
    return DeclarationOptions;
}());
exports.DeclarationOptions = DeclarationOptions;
/**
 * Implementation of the IDtdOptions interface used to provide default values
 * to fields.
 */
var DtdOptions = /** @class */ (function () {
    function DtdOptions(validation, dtdOptions) {
        if (dtdOptions === void 0) { dtdOptions = {}; }
        this.include = false;
        if (!(0, utils_1.isUndefined)(dtdOptions.include)) {
            this.include = dtdOptions.include;
        }
        if (validation && (0, utils_1.isUndefined)(dtdOptions.name) && this.include) {
            throw new Error("options.dtd.name should be defined if" +
                " options.dtd.include is true");
        }
        this.name = dtdOptions.name;
        this.sysId = dtdOptions.sysId;
        this.pubId = dtdOptions.pubId;
    }
    return DtdOptions;
}());
exports.DtdOptions = DtdOptions;
/**
 * Implementation of the IFormatOptions interface used to provide default values
 * to fields.
 */
var FormatOptions = /** @class */ (function () {
    function FormatOptions(formatOptions) {
        if (formatOptions === void 0) { formatOptions = {}; }
        this.doubleQuotes = formatOptions.doubleQuotes;
        this.indent = formatOptions.indent;
        this.newline = formatOptions.newline;
        this.pretty = formatOptions.pretty;
    }
    return FormatOptions;
}());
exports.FormatOptions = FormatOptions;
/**
 * Implementation of the ITypeHandlers interface used to provide default values
 * to fields.
 */
var TypeHandlers = /** @class */ (function () {
    function TypeHandlers(typeHandlers) {
        if (typeHandlers === void 0) { typeHandlers = {}; }
        for (var key in typeHandlers) {
            if (Object.prototype.hasOwnProperty.call(typeHandlers, key)) {
                this[key] = typeHandlers[key];
            }
        }
    }
    return TypeHandlers;
}());
exports.TypeHandlers = TypeHandlers;
/**
 * Implementation of the IWrapHandlers interface used to provide default values
 * to fields.
 */
var WrapHandlers = /** @class */ (function () {
    function WrapHandlers(wrapHandlers) {
        if (wrapHandlers === void 0) { wrapHandlers = {}; }
        for (var key in wrapHandlers) {
            if (Object.prototype.hasOwnProperty.call(wrapHandlers, key)) {
                this[key] = wrapHandlers[key];
            }
        }
    }
    return WrapHandlers;
}());
exports.WrapHandlers = WrapHandlers;