MitocGroup/deep-framework

View on GitHub
src/deep-kernel/lib/Config/Driver/ComplexDriver.js

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * Created by AlexanderC on 3/7/16.
 */

'use strict';

import {AbstractDriver} from './AbstractDriver';

export class ComplexDriver extends AbstractDriver {
  /**
   * @param {AbstractDriver|*} drivers
   */
  constructor(...drivers) {
    super();

    this._drivers = drivers;
  }

  /**
   * @returns {AbstractDriver[]|*[]|*}
   */
  get drivers() {
    return this._drivers;
  }

  /**
   * @param {AbstractDriver|*} driver
   * @returns {ComplexDriver}
   */
  add(driver) {
    this._drivers.push(driver);

    return this;
  }

  /**
   * @private
   */
  _load(...drivers) {
    this._drivers = this._drivers.concat(drivers);

    this._loadDriversQueue([].concat(this._drivers));
  }

  /**
   * @param {AbstractDriver[]|*[]} drivers
   * @param {Error[]|String[]|*[]} errors
   * @private
   */
  _loadDriversQueue(drivers, errors = []) {
    if (drivers.length <= 0) {
      this.fail(`All drivers failed to load: ${errors.join('; ')}`);

      return;
    }

    let driver = drivers.shift();

    driver.onLoadedCb((config) => {
      this.loaded(config);
    });

    driver.onFailCb((error) => {
      errors.push(error.toString());

      this._loadDriversQueue(drivers, errors);
    });

    driver.load();
  }
}