diff --git a/core/modules/commander.js b/core/modules/commander.js index fe796fd7c5..2039bc15b1 100644 --- a/core/modules/commander.js +++ b/core/modules/commander.js @@ -95,8 +95,8 @@ Commander.prototype.executeNextCommand = function() { this.streams.output.write("Executing command: " + commandName + " " + params.join(" ") + "\n"); } // Parse named parameters if required - if(command.info.namedParameters) { - params = this.extractNamedParameters(params,command.info.namedParameters); + if(command.info.namedParameterMode) { + params = this.extractNamedParameters(params,command.info.mandatoryParameters,command.info.optionalParameters); if(typeof params === "string") { return this.callback(params); } @@ -130,23 +130,35 @@ Commander.prototype.executeNextCommand = function() { }; /* -Given an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error +Given an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, and an array of optional parameters in +`optionalParameter`, returns a hashmap of values or a string if error */ -Commander.prototype.extractNamedParameters = function(params,mandatoryParameters) { +Commander.prototype.extractNamedParameters = function(params,mandatoryParameters,optionalParameters) { + mandatoryParameters = mandatoryParameters || []; + optionalParameters = optionalParameters || []; var errors = [], paramsByName = Object.create(null); + // Extract the parameters $tw.utils.each(params,function(param) { - var index = param.indexOf(":"); + var index = param.indexOf("="); if(index < 1) { errors.push("malformed named parameter: '" + param + "'"); } paramsByName[param.slice(0,index)] = param.slice(index+1); }); + // Check the mandatory parameters are present $tw.utils.each(mandatoryParameters,function(mandatoryParameter) { if(!$tw.utils.hop(paramsByName,mandatoryParameter)) { errors.push("missing mandatory parameter: '" + mandatoryParameter + "'"); } }); + // Check there no parameters that are not mandatory or optional + $tw.utils.each(paramsByName,function(value,name) { + if(mandatoryParameters.indexOf(name) === -1 && optionalParameters.indexOf(name) === -1) { + errors.push("unknown parameter: '" + name + "'"); + } + }); + // Return any errors if(errors.length > 0) { return errors.join(" and\n"); } else { diff --git a/core/modules/commands/listen.js b/core/modules/commands/listen.js index 3cb04f6810..4602a66b72 100644 --- a/core/modules/commands/listen.js +++ b/core/modules/commands/listen.js @@ -17,7 +17,9 @@ var Server = require("$:/core/modules/server.js").Server; exports.info = { name: "listen", synchronous: true, - namedParameters: [] // Use named parameters, but none of them are mandatory + namedParameterMode: true, + mandatoryParameters: [], + optionalParameters: ["port","host","rootTiddler","renderType","serveType","username","password","pathprefix","debugLevel"] }; var Command = function(params,commander,callback) { @@ -25,7 +27,6 @@ var Command = function(params,commander,callback) { this.params = params; this.commander = commander; this.callback = callback; - this.knownParameters = ["port","host","rootTiddler","renderType","serveType","username","password","pathprefix","debugLevel"]; }; Command.prototype.execute = function() { @@ -35,7 +36,7 @@ Command.prototype.execute = function() { } // Set up server var variables = Object.create(null); - $tw.utils.each(this.knownParameters,function(name) { + $tw.utils.each(exports.info.optionalParameters,function(name) { if($tw.utils.hop(self.params,name)) { variables[name] = self.params[name]; }