| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 | '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' });            });    }};
 |