argParser
by Hans PUFAL
JavaScript
function argParser(args, specs, opts) {
"use strict"; //========================= argParser ===
function setArg(arg, spec, val) {
(Array.isArray(arg) ? arg : [arg]).concat(spec.alias || []).forEach(
function(argn) {
if (spec.multi)
argn in argObj ? argObj[argn].push(val) : (argObj[argn] = [val]);
else if (argn in argObj && !(spec.typ || 's')[0] == 'b')
(argObj._errs || (argObj._errs = [])).push('Arg ' + argn + ' previously set to ' +
argObj[argn]);
else
argObj[argn] = val;
})
};
var argObj = {
_: ''
};
(opts = opts || {}).argString && (argObj[opts.argString] = args);
args = !Array.isArray(args) ? '' + args : args.join(' ');
for (var arg, val, argn, argspec; arg = args.match(/^\s*(-|--)([a-z_$][\w_$]*)?[\s$]/i);) {
args = args.slice(arg[0].length);
val = undefined;
if (!(argn = arg[2])) break;
argn = arg[1] == '-' ? argn.split('') : [argn];
while (argn.length) {
if (!(argspec = specs[Object.keys(specs).find(
function(key) {
var k = key.split(/(?:\s*,\s*)/);
return k.indexOf(argn[0]) != -1 ||
specs[key].alias == argn[0] ||
specs[key].alias && specs[key].alias.find &&
specs[key].alias.find(function(alias) {
return alias == argn[0] ? !!(argn[0] = key) : false
})
})])) {
if (!(argspec = opts.defaultSpec || {})) {
(argObj._errs || (argObj._errs = [])).push('No spec for ' + arg[2]);
argn.shift();
continue
}
}
if (argn.length == 1)
break;
switch ((argspec.typ || 's')[0]) {
case 'b':
val = !(argn[0] in argObj ? argObj[argn[0]] : argspec.dflt);
break;
case 'n':
if (val = argn.join('').match(/^.((0x[\da-f]+)|(0o[0-7]+)|(0b[01]+)|\d+)/i)) {
argn.splice(1, val[1].length);
val = +val[1];
...