diff --git a/lib/validator.js b/lib/validator.js index cc35072..06f60d7 100644 --- a/lib/validator.js +++ b/lib/validator.js @@ -2,7 +2,8 @@ // validates an Object containing Robot parameters -var Logger = require("./logger"); +var Logger = require("./logger"), + _ = require("./utils/helpers"); function hasProp(object, prop) { return object.hasOwnProperty(prop); @@ -14,32 +15,79 @@ function die() { throw RobotDSLError; } -function log(messages) { +function warn(messages) { messages = [].concat(messages); - messages.map(function(msg) { Logger.fatal(msg); }); + messages.map(function(msg) { Logger.warn(msg); }); } -var check = {}; +function fatal(messages) { + messages = [].concat(messages); + messages.map(function(msg) { Logger.fatal(msg); }); + die(); +} -check.singleObjectSyntax = function(opts, key) { +var checks = {}; + +checks.singleObjectSyntax = function(opts, key) { var single = hasProp(opts, key), plural = hasProp(opts, key + "s"); if (single && !plural) { - log([ + 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/" ]); + } +}; - die(); +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 + ]); + } + }); } }; module.exports.validate = function validate(opts) { opts = opts || {}; - ["connection", "device"].map(function(type) { - check.singleObjectSyntax(opts, type); + _.each(checks, function(check) { + check(opts); }); };