diff options
Diffstat (limited to 'packages/taler-util/src/clk.ts')
-rw-r--r-- | packages/taler-util/src/clk.ts | 61 |
1 files changed, 29 insertions, 32 deletions
diff --git a/packages/taler-util/src/clk.ts b/packages/taler-util/src/clk.ts index e99ebf733..60969af69 100644 --- a/packages/taler-util/src/clk.ts +++ b/packages/taler-util/src/clk.ts @@ -17,16 +17,20 @@ /** * Imports. */ -import process from "process"; -import path from "path"; -import readline from "readline"; -import { devNull } from "os"; +import { + processExit, + processArgv, + readlinePrompt, + pathBasename, +} from "#compat-impl"; +import { AmountString } from "./taler-types.js"; export namespace clk { class Converter<T> {} export const INT = new Converter<number>(); export const STRING: Converter<string> = new Converter<string>(); + export const AMOUNT: Converter<AmountString> = new Converter<AmountString>(); export interface OptionArgs<T> { help?: string; @@ -336,6 +340,8 @@ export namespace clk { myArgs[def.name] = Number.parseInt(value); } else if (def.conv == null || def.conv === STRING) { myArgs[def.name] = value; + } else if (def.conv == null || def.conv === AMOUNT) { + myArgs[def.name] = value; } else { throw Error("unknown converter"); } @@ -359,13 +365,13 @@ export namespace clk { console.error( `error: unknown option '--${r.key}' for ${currentName}`, ); - process.exit(-1); + processExit(-1); throw Error("not reached"); } if (d.isFlag) { if (r.value !== undefined) { console.error(`error: flag '--${r.key}' does not take a value`); - process.exit(-1); + processExit(-1); throw Error("not reached"); } storeFlag(d, true); @@ -373,7 +379,7 @@ export namespace clk { if (r.value === undefined) { if (i === unparsedArgs.length - 1) { console.error(`error: option '--${r.key}' needs an argument`); - process.exit(-1); + processExit(-1); throw Error("not reached"); } storeOption(d, unparsedArgs[i + 1]); @@ -391,7 +397,7 @@ export namespace clk { const opt = this.shortOptions[chr]; if (!opt) { console.error(`error: option '-${chr}' not known`); - process.exit(-1); + processExit(-1); } if (opt.isFlag) { storeFlag(opt, true); @@ -399,7 +405,7 @@ export namespace clk { if (si == optShort.length - 1) { if (i === unparsedArgs.length - 1) { console.error(`error: option '-${chr}' needs an argument`); - process.exit(-1); + processExit(-1); throw Error("not reached"); } else { storeOption(opt, unparsedArgs[i + 1]); @@ -418,7 +424,7 @@ export namespace clk { const subcmd = this.subcommandMap[argVal]; if (!subcmd) { console.error(`error: unknown command '${argVal}'`); - process.exit(-1); + processExit(-1); throw Error("not reached"); } foundSubcommand = subcmd.commandGroup; @@ -427,7 +433,7 @@ export namespace clk { const d = this.arguments[posArgIndex]; if (!d) { console.error(`error: too many arguments for ${currentName}`); - process.exit(-1); + processExit(-1); throw Error("not reached"); } myArgs[d.name] = unparsedArgs[i]; @@ -437,7 +443,7 @@ export namespace clk { if (parsedArgs[this.argKey].help) { this.printHelp(progname, parents); - process.exit(0); + processExit(0); throw Error("not reached"); } @@ -450,7 +456,7 @@ export namespace clk { console.error( `error: missing positional argument '${d.name}' for ${currentName}`, ); - process.exit(-1); + processExit(-1); throw Error("not reached"); } } @@ -464,7 +470,7 @@ export namespace clk { } else { const name = option.flagspec.join(","); console.error(`error: missing option '${name}'`); - process.exit(-1); + processExit(-1); throw Error("not reached"); } } @@ -492,16 +498,16 @@ export namespace clk { } catch (e) { console.error(`An error occurred while running ${currentName}`); console.error(e); - process.exit(1); + processExit(1); } Promise.resolve(r).catch((e) => { console.error(`An error occurred while running ${currentName}`); console.error(e); - process.exit(1); + processExit(1); }); } else { this.printHelp(progname, parents); - process.exit(-1); + processExit(-1); throw Error("not reached"); } } @@ -524,15 +530,15 @@ export namespace clk { if (cmdlineArgs) { args = cmdlineArgs; } else { - args = process.argv.slice(1); + args = processArgv().slice(1); } if (args.length < 1) { console.error( "Error while parsing command line arguments: not enough arguments", ); - process.exit(-1); + processExit(-1); } - const progname = path.basename(args[0]); + const progname = pathBasename(args[0]); const rest = args.slice(1); this.mainCommand.run(progname, [], rest, {}); @@ -611,8 +617,8 @@ export namespace clk { export type GetArgType<T> = T extends Program<any, infer AT> ? AT : T extends CommandGroup<any, infer AT> - ? AT - : any; + ? AT + : any; export function program<PN extends keyof any>( argKey: PN, @@ -622,15 +628,6 @@ export namespace clk { } export function prompt(question: string): Promise<string> { - const stdinReadline = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - return new Promise<string>((resolve, reject) => { - stdinReadline.question(question, (res) => { - resolve(res); - stdinReadline.close(); - }); - }); + return readlinePrompt(question); } } |