You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.1 KiB
125 lines
3.1 KiB
'use strict'; |
|
|
|
const fs = require('fs'); |
|
|
|
const CoaObject = require('./coaobject'); |
|
|
|
/** |
|
* COA Parameter |
|
* |
|
* Base class for options and arguments |
|
* |
|
* --------|-----|-----|----- |
|
* | Cmd | Opt | Arg |
|
* --------|-----|-----|----- |
|
* arr | | ✓ | ✓ |
|
* req | | ✓ | ✓ |
|
* val | | ✓ | ✓ |
|
* def | | ✓ | ✓ |
|
* input | | ✓ | ✓ |
|
* output | | ✓ | ✓ |
|
* |
|
* @class CoaParam |
|
* @extends CoaObject |
|
*/ |
|
module.exports = class CoaParam extends CoaObject { |
|
constructor(cmd) { |
|
super(cmd); |
|
|
|
this._arr = false; |
|
this._req = false; |
|
this._val = undefined; |
|
this._def = undefined; |
|
} |
|
|
|
/** |
|
* Makes a param accepts multiple values. |
|
* Otherwise, the value will be used by the latter passed. |
|
* |
|
* @returns {COA.CoaParam} - this instance (for chainability) |
|
*/ |
|
arr() { |
|
this._arr = true; |
|
return this; |
|
} |
|
|
|
/** |
|
* Makes a param required. |
|
* |
|
* @returns {COA.CoaParam} - this instance (for chainability) |
|
*/ |
|
req() { |
|
this._req = true; |
|
return this; |
|
} |
|
|
|
/** |
|
* Set a validation (or value) function for param. |
|
* 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.CoaParam} - this instance (for chainability) |
|
*/ |
|
val(val) { |
|
this._val = val; |
|
return this; |
|
} |
|
|
|
/** |
|
* Set a default value for param. |
|
* Default value passed through validation function as ordinary value. |
|
* |
|
* @param {*} def - default value of function generator |
|
* @returns {COA.CoaParam} - this instance (for chainability) |
|
*/ |
|
def(def) { |
|
this._def = def; |
|
return this; |
|
} |
|
|
|
/** |
|
* Make option value inputting stream. |
|
* It's add useful validation and shortcut for STDIN. |
|
* |
|
* @returns {COA.CoaParam} - this instance (for chainability) |
|
*/ |
|
input() { |
|
process.stdin.pause(); |
|
return this |
|
.def(process.stdin) |
|
.val(function(v) { |
|
if(typeof v !== 'string') |
|
return v; |
|
|
|
if(v === '-') |
|
return process.stdin; |
|
|
|
const s = fs.createReadStream(v, { encoding : 'utf8' }); |
|
s.pause(); |
|
return s; |
|
}); |
|
} |
|
|
|
/** |
|
* Make option value outputing stream. |
|
* It's add useful validation and shortcut for STDOUT. |
|
* |
|
* @returns {COA.CoaParam} - this instance (for chainability) |
|
*/ |
|
output() { |
|
return this |
|
.def(process.stdout) |
|
.val(function(v) { |
|
if(typeof v !== 'string') |
|
return v; |
|
|
|
if(v === '-') |
|
return process.stdout; |
|
|
|
return fs.createWriteStream(v, { encoding : 'utf8' }); |
|
}); |
|
} |
|
};
|
|
|