| /* eslint-disable class-methods-use-this */ |
| 'use strict'; |
| |
| const Q = require('q'); |
| |
| /** |
| * COA Object |
| * |
| * Base class for all COA-related objects |
| * |
| * --------|-----|-----|----- |
| * | Cmd | Opt | Arg |
| * --------|-----|-----|----- |
| * name | ✓ | ✓ | ✓ |
| * title | ✓ | ✓ | ✓ |
| * comp | ✓ | ✓ | ✓ |
| * reject | ✓ | ✓ | ✓ |
| * end | ✓ | ✓ | ✓ |
| * apply | ✓ | ✓ | ✓ |
| * |
| * @class CoaObject |
| */ |
| module.exports = class CoaObject { |
| constructor(cmd) { |
| this._cmd = cmd; |
| this._name = null; |
| this._title = null; |
| this._comp = null; |
| } |
| |
| /** |
| * Set a canonical identifier to be used anywhere in the API. |
| * |
| * @param {String} name - command, option or argument name |
| * @returns {COA.CoaObject} - this instance (for chainability) |
| */ |
| name(name) { |
| this._name = name; |
| return this; |
| } |
| |
| /** |
| * Set a long description to be used anywhere in text messages. |
| * @param {String} title - human readable entity title |
| * @returns {COA.CoaObject} - this instance (for chainability) |
| */ |
| title(title) { |
| this._title = title; |
| return this; |
| } |
| |
| /** |
| * Set custom additional completion for current object. |
| * |
| * @param {Function} comp - completion generation function, |
| * invoked in the context of object instance. |
| * Accepts parameters: |
| * - {Object} opts - completion options |
| * It can return promise or any other value threated as a result. |
| * @returns {COA.CoaObject} - this instance (for chainability) |
| */ |
| comp(comp) { |
| this._comp = comp; |
| return this; |
| } |
| |
| /** |
| * Apply function with arguments in a context of object instance. |
| * |
| * @param {Function} fn - body |
| * @param {Array.<*>} args... - arguments |
| * @returns {COA.CoaObject} - this instance (for chainability) |
| */ |
| apply(fn) { |
| arguments.length > 1? |
| fn.apply(this, [].slice.call(arguments, 1)) |
| : fn.call(this); |
| |
| return this; |
| } |
| |
| /** |
| * Return reject of actions results promise with error code. |
| * Use in .act() for return with error. |
| * @param {Object} reason - reject reason |
| * You can customize toString() method and exitCode property |
| * of reason object. |
| * @returns {Q.promise} rejected promise |
| */ |
| reject(reason) { |
| return Q.reject(reason); |
| } |
| |
| /** |
| * Finish chain for current subcommand and return parent command instance. |
| * @returns {COA.Cmd} parent command |
| */ |
| end() { |
| return this._cmd; |
| } |
| }; |