(function (factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        var v = factory(require, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" && define.amd) {
        define(["require", "exports", "yaml", "../utils/customTags"], factory);
    }
})(function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    exports.getCustomTags = getCustomTags;
    const yaml_1 = require("yaml");
    const customTags_1 = require("../utils/customTags");
    class CommonTagImpl {
        constructor(tag, type, returnType) {
            this.tag = tag;
            this.type = type;
            this.returnType = returnType;
        }
        get collection() {
            if (this.type === 'mapping') {
                return 'map';
            }
            if (this.type === 'sequence') {
                return 'seq';
            }
            return undefined;
        }
        resolve(value) {
            if ((0, yaml_1.isMap)(value) && this.type === 'mapping') {
                return this.addReturnTypeMetadata(value);
            }
            if ((0, yaml_1.isSeq)(value) && this.type === 'sequence') {
                return this.addReturnTypeMetadata(value);
            }
            if (typeof value === 'string' && this.type === 'scalar') {
                return this.addReturnTypeMetadata(value);
            }
        }
        addReturnTypeMetadata(value) {
            if (!this.returnType) {
                return value;
            }
            if (typeof value === 'string') {
                const scalar = new yaml_1.Scalar(value);
                (0, customTags_1.setCustomTagReturnType)(scalar, this.returnType);
                return scalar;
            }
            (0, customTags_1.setCustomTagReturnType)(value, this.returnType);
            return value;
        }
    }
    class IncludeTag {
        constructor() {
            this.tag = '!include';
            this.type = 'scalar';
        }
        resolve(value, onError) {
            if (value && value.length > 0 && value.trim()) {
                return value;
            }
            onError('!include without value');
        }
    }
    /**
     * Converts the tags from settings and adds known tags such as !include
     * and returns Tags that can be used by the parser.
     * @param customTags Tags for parser
     */
    function getCustomTags(customTags) {
        const tags = [];
        for (const tag of customTags ?? []) {
            const parsedTag = (0, customTags_1.parseCustomTag)(tag);
            if (parsedTag) {
                tags.push(new CommonTagImpl(parsedTag.tag, parsedTag.inputType, parsedTag.returnType));
            }
        }
        tags.push(new IncludeTag());
        return tags;
    }
});
//# sourceMappingURL=custom-tag-provider.js.map