Source: cmdhelp.js

/**
 * @file Helper class
 * @author José Marco Zanichelli
 * @version: 0.1
 */

/**
 * @alias Helper
 * @class Helper
 * @namespace
 */
var Helper = function(flag_types,default_flag){
    this.flag_types = extend({},flag_types);
    this.default_flag = default_flag;
    //return this;
};

var colors = require('colors/safe'),
    extend = require('util')._extend,
    errors = [
        {id: 0, msg: "no command defined"},
        {id: 1, msg: "only 1 flag allowed"},
        {id: 2, msg: "flag type not found"},
        {id: 3, msg: "ony 1 command allowed"}
    ],
    flags,
    opts
;

getError = function(id){
  return extend([],errors.filter(function(item){
      return item.id==id;
  }))[0];
};

handleError = function(argv,err,callback){
    var result = {args:argv,res:err};
    callback(result);
    return result;
};


/**
 * @private
 * @alias Helper.parse
 * @memberof Helper
 * @param {object} argv - <b>minimist</b> arguments
 * @param {object} [callback] - callback function
 * @returns {object}
 */
parseArgv = function(argv,callback){
    callback = callback || function(){};
    argv = extend({},argv || {_:[]});
    if (argv._.length){
        argv[this.default_flag] = [].concat(argv[this.default_flag]);
        argv[this.default_flag] = argv[this.default_flag].concat(argv._);
    }
    delete argv._;
    flags = Object.keys(argv);

    if (!flags.length) return handleError(argv,getError(0),callback);
    if (flags.length>1) return handleError(argv,getError(1),callback);

    flags.forEach(function(a){
        argv[a] =  [].concat(argv[a]);
        argv[a] =  argv[a].filter(function(cmd){
            return !!cmd;
        });
    });

    if (!this.flag_types[flags[0]]) return handleError(argv,getError(2),callback);
    if (argv[flags[0]].length!=1) return handleError(argv,getError(3),callback);


    opts = {
        type: flags[0],
        cmd: argv[flags[0]][0]
    };

    callback(null, opts);
    return opts;
};

getParser = function(argv){
    return this.parse.bind(this,argv);
};

getFlagMethod = function(flag){
    return this.flag_types[flag].method;
};


Helper.prototype.parse = parseArgv;
Helper.prototype.getParser = getParser;

module.exports = Helper;