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