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