/* 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; } };