diff options
Diffstat (limited to 'node_modules/coa/lib/opt.js')
| -rw-r--r-- | node_modules/coa/lib/opt.js | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/node_modules/coa/lib/opt.js b/node_modules/coa/lib/opt.js new file mode 100644 index 00000000..9aaca543 --- /dev/null +++ b/node_modules/coa/lib/opt.js @@ -0,0 +1,338 @@ +// Generated by CoffeeScript 1.6.3 +var Cmd, Color, Opt, Q, fs; + +fs = require('fs'); + +Q = require('q'); + +Color = require('./color').Color; + +Cmd = require('./cmd').Cmd; + +/** +Option + +Named entity. Options may have short and long keys for use from command line. +@namespace +@class Presents option +*/ + + +exports.Opt = Opt = (function() { + /** + @constructs + @param {COA.Cmd} cmd parent command + */ + + function Opt(_cmd) { + this._cmd = _cmd; + this._cmd._opts.push(this); + } + + /** + Set a canonical option identifier to be used anywhere in the API. + @param {String} _name option name + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.name = function(_name) { + this._name = _name; + return this; + }; + + /** + Set a long description for option to be used anywhere in text messages. + @param {String} _title option title + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.title = Cmd.prototype.title; + + /** + Set a short key for option to be used with one hyphen from command line. + @param {String} _short + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.short = function(_short) { + this._short = _short; + return this._cmd._optsByKey['-' + _short] = this; + }; + + /** + Set a short key for option to be used with double hyphens from command line. + @param {String} _long + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.long = function(_long) { + this._long = _long; + return this._cmd._optsByKey['--' + _long] = this; + }; + + /** + Make an option boolean, i.e. option without value. + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.flag = function() { + this._flag = true; + return this; + }; + + /** + Makes an option accepts multiple values. + Otherwise, the value will be used by the latter passed. + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.arr = function() { + this._arr = true; + return this; + }; + + /** + Makes an option required. + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.req = function() { + this._req = true; + return this; + }; + + /** + Makes an option to act as a command, + i.e. program will exit just after option action. + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.only = function() { + this._only = true; + return this; + }; + + /** + Set a validation (or value) function for option. + Value from command line passes through before becoming available from API. + Using for validation and convertion simple types to any values. + @param {Function} _val validating function, + invoked in the context of option instance + and has one parameter with value from command line + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.val = function(_val) { + this._val = _val; + return this; + }; + + /** + Set a default value for option. + Default value passed through validation function as ordinary value. + @param {Object} _def + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.def = function(_def) { + this._def = _def; + return this; + }; + + /** + Make option value inputting stream. + It's add useful validation and shortcut for STDIN. + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.input = function() { + process.stdin.pause(); + return this.def(process.stdin).val(function(v) { + var s; + if (typeof v === 'string') { + if (v === '-') { + return process.stdin; + } else { + s = fs.createReadStream(v, { + encoding: 'utf8' + }); + s.pause(); + return s; + } + } else { + return v; + } + }); + }; + + /** + Make option value outputing stream. + It's add useful validation and shortcut for STDOUT. + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.output = function() { + return this.def(process.stdout).val(function(v) { + if (typeof v === 'string') { + if (v === '-') { + return process.stdout; + } else { + return fs.createWriteStream(v, { + encoding: 'utf8' + }); + } + } else { + return v; + } + }); + }; + + /** + Add action for current option command. + This action is performed if the current option + is present in parsed options (with any value). + @param {Function} act action function, + invoked in the context of command instance + and has the parameters: + - {Object} opts parsed options + - {Array} args parsed arguments + - {Object} res actions result accumulator + It can return rejected promise by Cmd.reject (in case of error) + or any other value treated as result. + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.act = function(act) { + var name, opt; + opt = this; + name = this._name; + this._cmd.act(function(opts) { + var res, + _this = this; + if (name in opts) { + res = act.apply(this, arguments); + if (opt._only) { + return Q.when(res, function(res) { + return _this.reject({ + toString: function() { + return res.toString(); + }, + exitCode: 0 + }); + }); + } else { + return res; + } + } + }); + return this; + }; + + /** + Set custom additional completion for current option. + @param {Function} completion generation function, + invoked in the context of option instance. + Accepts parameters: + - {Object} opts completion options + It can return promise or any other value treated as result. + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.comp = Cmd.prototype.comp; + + Opt.prototype._saveVal = function(opts, val) { + var _name; + if (this._val) { + val = this._val(val); + } + if (this._arr) { + (opts[_name = this._name] || (opts[_name] = [])).push(val); + } else { + opts[this._name] = val; + } + return val; + }; + + Opt.prototype._parse = function(argv, opts) { + return this._saveVal(opts, this._flag ? true : argv.shift()); + }; + + Opt.prototype._checkParsed = function(opts, args) { + return !opts.hasOwnProperty(this._name); + }; + + Opt.prototype._usage = function() { + var nameStr, res; + res = []; + nameStr = this._name.toUpperCase(); + if (this._short) { + res.push('-', Color('lgreen', this._short)); + if (!this._flag) { + res.push(' ' + nameStr); + } + res.push(', '); + } + if (this._long) { + res.push('--', Color('green', this._long)); + if (!this._flag) { + res.push('=' + nameStr); + } + } + res.push(' : ', this._title); + if (this._req) { + res.push(' ', Color('lred', '(required)')); + } + return res.join(''); + }; + + Opt.prototype._requiredText = function() { + return 'Missing required option:\n ' + this._usage(); + }; + + /** + Return rejected promise with error code. + Use in .val() for return with error. + @param {Object} reject reason + You can customize toString() method and exitCode property + of reason object. + @returns {Q.promise} rejected promise + */ + + + Opt.prototype.reject = Cmd.prototype.reject; + + /** + Finish chain for current option and return parent command instance. + @returns {COA.Cmd} parent command + */ + + + Opt.prototype.end = Cmd.prototype.end; + + /** + Apply function with arguments in context of option instance. + @param {Function} fn + @param {Array} args + @returns {COA.Opt} this instance (for chainability) + */ + + + Opt.prototype.apply = Cmd.prototype.apply; + + return Opt; + +})(); |
