hybridgroup/cylon

View on GitHub
lib/validator.js

Summary

Maintainability
A
3 hrs
Test Coverage
"use strict";

// validates an Object containing Robot parameters

var Logger = require("./logger"),
    _ = require("./utils/helpers");

function hasProp(object, prop) {
  return object.hasOwnProperty(prop);
}

function die() {
  var RobotDSLError = new Error("Unable to start robot due to a syntax error");
  RobotDSLError.name = "RobotDSLError";
  throw RobotDSLError;
}

function warn(messages) {
  messages = [].concat(messages);
  messages.map(function(msg) { Logger.log(msg); });
}

function fatal(messages) {
  messages = [].concat(messages);
  messages.map(function(msg) { Logger.log(msg); });
  die();
}

var checks = {};

checks.singleObjectSyntax = function(opts, key) {
  var single = hasProp(opts, key),
      plural = hasProp(opts, key + "s");

  if (single && !plural) {
    fatal([
      "The single-object '" + key + "' syntax for robots is not valid.",
      "Instead, use the multiple-value '" + key + "s' key syntax.",
      "Details: http://cylonjs.com/documentation/guides/working-with-robots/"
    ]);
  }
};

checks.singleObjectSyntax = function(opts) {
  ["connection", "device"].map(function(key) {
    var single = hasProp(opts, key),
        plural = hasProp(opts, key + "s");

    if (single && !plural) {
      fatal([
        "The single-object '" + key + "' syntax for robots is not valid.",
        "Instead, use the multiple-value '" + key + "s' key syntax.",
        "Details: http://cylonjs.com/documentation/guides/working-with-robots/"
      ]);
    }
  });
};

checks.deviceWithoutDriver = function(opts) {
  if (opts.devices) {
    _.each(opts.devices, function(device, name) {
      if (!device.driver || device.driver === "") {
        fatal("No driver supplied for device " + name);
      }
    });
  }
};

checks.devicesWithoutConnection = function(opts) {
  var connections = opts.connections,
      devices = opts.devices;

  if (devices && connections && Object.keys(connections).length > 1) {
    var first = Object.keys(connections)[0];

    _.each(devices, function(device, name) {
      if (!device.connection || device.connection === "") {
        warn([
          "No explicit connection provided for device " + name,
          "Will default to using connection " + first
        ]);
      }
    });
  }
};

checks.noConnections = function(opts) {
  var connections = Object.keys(opts.connections || {}).length,
      devices = Object.keys(opts.devices || {}).length;

  if (devices && !connections) {
    fatal(["No connections provided for devices"]);
  }
};

module.exports.validate = function validate(opts) {
  opts = opts || {};

  _.each(checks, function(check) {
    check(opts);
  });
};