Fork me on GitHub
Show:

File: ../src/directions/helpers/directionsresultsvalidator.js

define([
  'aeris/util',
  'aeris/helpers/validator/abstractvalidator',
  'aeris/helpers/validator/pathvalidator',
  'aeris/directions/errors/invaliddirectionsresultserror',
  'aeris/directions/results/directionsresultsstatus'
], function(_, AbstractValidator, PathValidator, InvalidDirectionsResultsError, DirectionsResultsStatus) {
  /**
   * Validates an {aeris.directions.results.DirectionsResults} object.
   *
   * @class aeris.directions.results.DirectionsResultsValidator
   * @extends aeris.helpers.validator.AbstractValidator
   * @implements aeris.helpers.validator.ValidatorInterface
   *
   * @constructor
   */
  var DirectionsResultsValidator = function(results) {
    this.results_ = results;
    AbstractValidator.call(this, results);
  };
  _.inherits(DirectionsResultsValidator, AbstractValidator);


  /**
   * @return {Boolean}
   * @method isValid
   */
  DirectionsResultsValidator.prototype.isValid = function() {
    this.clearLastError_();

    var pathError = this.getPathError_(this.results_.path);
    var statusError = this.getStatusError_(this.results_.status);
    var distanceError = this.getDistanceError_(this.results_.distance);
    var anyError = pathError || statusError || distanceError;

    if (anyError) {
      this.setLastError_(anyError);
    }

    return (!anyError);
  };


  /**
   * @param {aeris.maps.Path} path
   * @return {aeris.directions.errors.InvalidDirectionsResultsError=}
   * @private
   * @method getPathError_
   */
  DirectionsResultsValidator.prototype.getPathError_ = function(path) {
    var pathValidator = new PathValidator(path);

    if (!pathValidator.isValid()) {
      return new InvalidDirectionsResultsError(path + ' is not a valid path.');
    }
  };


  /**
   * @param {Object} status
   * @return {aeris.directions.errors.InvalidDirectionsResultsError=}
   * @private
   * @method getStatusError_
   */
  DirectionsResultsValidator.prototype.getStatusError_ = function(status) {
    if (!_.isObject(status)) {
      return new InvalidDirectionsResultsError(status + ' is not a valid status.');
    }
    if (!this.isValidStatusCode_(status.code)) {
      return new InvalidDirectionsResultsError(status.code + ' is not a valid status code.');
    }
    if (!_.isString(status.message)) {
      return new InvalidDirectionsResultsError(status.message + ' is not a valid status message');
    }
  };


  /**
   * @param {number} distance
   * @return {aeris.directions.errors.InvalidDirectionsResultsError=}
   * @private
   * @method getDistanceError_
   */
  DirectionsResultsValidator.prototype.getDistanceError_ = function(distance) {
    var isPositiveNumber = _.isNumeric(distance) && distance >= 0;
    var isValid = !_.isNull(distance) && !isPositiveNumber;

    if (isValid) {
      return new InvalidDirectionsResultsError(distance + ' is not a valid distance.');
    }
  };


  /**
   * @param {string} code
   * @return {Boolean}
   * @private
   * @method isValidStatusCode_
   */
  DirectionsResultsValidator.prototype.isValidStatusCode_ = function(code) {
    return _.contains(DirectionsResultsStatus, code);
  };


  return DirectionsResultsValidator;
});