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