more types
This commit is contained in:
		| @@ -1,22 +1,30 @@ | ||||
| /* eslint-disable complexity */ | ||||
| /* eslint-disable max-statements */ | ||||
| /* eslint-disable no-process-env */ | ||||
| import { Persistent } from '@scode/modelling'; | ||||
| import fs from 'fs-extra'; | ||||
|  | ||||
| enum OptionType { | ||||
|   string = 'string', | ||||
|   number = 'number', | ||||
|   boolean = 'boolean' | ||||
|   boolean = 'boolean', | ||||
|   file = 'file', | ||||
|   folder = 'folder', | ||||
|   path = 'path' | ||||
| } | ||||
|  | ||||
| interface Option { | ||||
|   name: string; | ||||
|   type: OptionType; | ||||
|   required?: boolean; | ||||
|   default: unknown; | ||||
|   alias: string; | ||||
|   env: string; | ||||
|   default?: unknown; | ||||
|   alias?: string; | ||||
|   env?: string; | ||||
| } | ||||
|  | ||||
| interface OptionProcess extends Option { | ||||
|   filled: boolean; | ||||
|   value?: unknown; | ||||
| } | ||||
|  | ||||
| export class InteractiveOptions extends Persistent { | ||||
| @@ -42,11 +50,66 @@ export class InteractiveOptions extends Persistent { | ||||
|     await this.get_interactive_options (); | ||||
|   } | ||||
|  | ||||
|   private get_env_options (): void { | ||||
|  | ||||
|   private get unfilled (): Array<OptionProcess> { | ||||
|     return this.options.filter ((o) => !o.filled); | ||||
|   } | ||||
|  | ||||
|   private get_args_options (): void { | ||||
|   private async assign_arg (opt: OptionProcess, value: unknown): Promise<void> { | ||||
|     if (opt.type === OptionType.string) { | ||||
|       opt.value = value; | ||||
|       opt.filled = true; | ||||
|       return; | ||||
|     } | ||||
|     if (opt.type === OptionType.number) { | ||||
|       const as_num = parseInt (value); | ||||
|       const is_num = !isNaN (as_num); | ||||
|       if (is_num) { | ||||
|         opt.value = as_num; | ||||
|         opt.filled = true; | ||||
|       } | ||||
|       return; | ||||
|     } | ||||
|     if (opt.type === OptionType.boolean) { | ||||
|       const is_boo = (/^(?:true|false)$/ui).test (value); | ||||
|       if (is_boo) { | ||||
|         const as_boo = (/true/ui).test (value); | ||||
|         opt.value = as_boo; | ||||
|         opt.filled = true; | ||||
|       } | ||||
|       return; | ||||
|     } | ||||
|     if ( | ||||
|       opt.type === OptionType.path | ||||
|       || opt.type === OptionType.file | ||||
|       || opt.type === OptionType.folder | ||||
|     ) { | ||||
|       if (!await fs.pathExists (value)) | ||||
|         return; | ||||
|       if (opt.type === OptionType.path) { | ||||
|         opt.value = value; | ||||
|         opt.filled = true; | ||||
|         return; | ||||
|       } | ||||
|       const stat = await fs.stat (value); | ||||
|       if (stat.isDirectory () === (opt.type === OptionType.folder)) { | ||||
|         opt.value = value; | ||||
|         opt.filled = true; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private async get_env_options (): void { | ||||
|     await Promise.all (this.options.map ((opt) => { | ||||
|       if ( | ||||
|         typeof opt.env !== 'undefined' | ||||
|         && typeof process.env[opt.env] !== 'undefined' | ||||
|       ) | ||||
|         return this.assign_arg (opt, process.env[opt.env]); | ||||
|       return Promise.resolve (); | ||||
|     })); | ||||
|   } | ||||
|  | ||||
|   private async get_args_options (): void { | ||||
|  | ||||
|   } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user