Source: Report/SingleReport.js

"use strict";

const Promise = require('bluebird');
const AbstractReport = require("./AbstractReport");

/**
 * @extends {AbstractReport}
 */
class SingleReport extends AbstractReport {

    /**
     * Execute single loader
     *
     * @param {Array} loaders
     * @param {Array} enabledLoaders
     * @returns {Promise.<T>}
     * @private
     */
    _processSingleLoader(loaders, enabledLoaders) {
        let loader = loaders.pop();
        loader.url = this.url;

        if (!!~enabledLoaders.indexOf(loader.getKey())) {
            loader.isLoading = true;
            return loader.start()
                .then(() => {
                    loader.isLoading = false;
                    if (loaders.length > 0) {
                        return this._processSingleLoader(loaders, enabledLoaders);
                    }
                    return null;
                })
                .catch(e => {
                    loader.errorMessage = e.message;
                    console.error(e);
                })
        }

        if (loaders.length > 0) {
            return this._processSingleLoader(loaders, enabledLoaders);
        }
        return Promise.resolve(null);

    }

    /**
     * run all loaders to create a report
     *
     * @param {Array} enabledLoaders array of loader names
     * @returns {Promise}
     */
    create(enabledLoaders) {
        this.isCompleted = false;
        let loaders = Object.values(this.loaders).splice(0);
        for (let i = 0; i < loaders.length; i++) {
            if (!!~enabledLoaders.indexOf(loaders[i].getKey())) {
                loaders[i].isLoading = true;
            }
        }

        return this._processSingleLoader(loaders, enabledLoaders)
            .then(() => {
                this.createdAt = Date.now();
                this.isCompleted = true;
            })
            .catch((e) => {
                this.isCompleted = false;
                throw e;
            })
    }
}

module.exports = SingleReport;