Fork me on GitHub
Show:

File: ../src/directions/promises/promisetofetchdirections.js

define([
  'aeris/util',
  'aeris/promise',
  'aeris/errors/invalidargumenterror',
  'aeris/directions/results/directionsresults',
  'aeris/directions/results/directionsresultsstatus'
], function(_, Promise, InvalidArgumentError, DirectionsResults, DirectionsResultsStatus) {
  /**
   * Resolves with a {aeris.directions.results.DirectionsResults}
   * object.
   *
   * @class aeris.directions.promise.PromiseToFetchDirections
   * @extends aeris.Promise
   *
   * @constructor
   * @override
  */
  var PromiseToFetchDirections = function() {
    Promise.apply(this, arguments);
  };
  _.inherits(PromiseToFetchDirections, Promise);


  /**
   * @param {aeris.maps.Path} path
   * @param {number} distance
   * @param {string} opt_apiCode
   * @method resolveWithPathAndDistance
   */
  PromiseToFetchDirections.prototype.resolveWithPathAndDistance = function(path, distance, opt_apiCode) {
    var results = this.createResults_({
      path: path,
      distance: distance,
      status: {
        code: this.getStatusCode_('OK'),
        apiCode: opt_apiCode,
        message: 'Successfully fetched directions.'
      }
    });

    this.resolve(results);
  };


  /**
   * @param {string} apiCode
   * @method rejectBecauseNoResults
   */
  PromiseToFetchDirections.prototype.rejectBecauseNoResults = function(apiCode) {
    var aerisCode = this.getStatusCode_('NO_RESULTS');
    var message = 'Unable to fetch directions: no results were returned';

    this.rejectWithStatus({
      code: aerisCode,
      apiCode: apiCode,
      message: message
    });
  };


  /**
   * @param {string} apiCode
   * @method rejectBecauseApiError
   */
  PromiseToFetchDirections.prototype.rejectBecauseApiError = function(apiCode) {
    var aerisCode = this.getStatusCode_('API_ERROR');
    var message = 'Unable to fetch directions: the API returned an error.';

    this.rejectWithStatus({
      code: aerisCode,
      apiCode: apiCode,
      message: message
    });
  };

  /**
   * @param {Error} error
   * @method rejectUsingErrorObject
   */
  PromiseToFetchDirections.prototype.rejectUsingErrorObject = function(error) {
    this.rejectWithStatus({
      code: this.getStatusCode_('API_ERROR'),
      message: error.message
    });
  };


  /**
   * @param {Object} status
   * @method rejectWithStatus
   */
  PromiseToFetchDirections.prototype.rejectWithStatus = function(status) {
    var results = this.createResults_({
      path: [],
      distance: null,
      status: status
    });

    this.reject(results);
  };


  /**
   * @param {string} statusCodeKey
   * @return {aeris.directions.results.DirectionsResultsStatus}
   * @private
   * @method getStatusCode_
   */
  PromiseToFetchDirections.prototype.getStatusCode_ = function(statusCodeKey) {
    var statusCode = DirectionsResultsStatus[statusCodeKey];

    if (!statusCode) {
      throw new InvalidArgumentError(statusCode + ' is not a valid DirectionsResultsStatus');
    }

    return statusCode;
  };


  /**
   * @param {Object} results
   * @return {aeris.directions.results.DirectionsResults}
   * @private
   * @method createResults_
   */
  PromiseToFetchDirections.prototype.createResults_ = function(results) {
    return new DirectionsResults(results);
  };


  return PromiseToFetchDirections;
});