summaryrefslogtreecommitdiff
path: root/u/process/argv.ts
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2025-06-20 14:53:38 -0700
committerElizabeth Hunt <me@liz.coffee>2025-06-20 14:53:38 -0700
commitd4791f3d357634daf506fb8f91cc5332a794c421 (patch)
tree1bb01d2d4d8fa74d83bb6f99f2c8aa4146ca2d11 /u/process/argv.ts
parentd7e8d31c94cd713a2f4cf799e20e993acc69e361 (diff)
downloadci-d4791f3d357634daf506fb8f91cc5332a794c421.tar.gz
ci-d4791f3d357634daf506fb8f91cc5332a794c421.zip
Move to nodejs
Diffstat (limited to 'u/process/argv.ts')
-rw-r--r--u/process/argv.ts77
1 files changed, 38 insertions, 39 deletions
diff --git a/u/process/argv.ts b/u/process/argv.ts
index 45f8ff0..dcdba85 100644
--- a/u/process/argv.ts
+++ b/u/process/argv.ts
@@ -1,7 +1,6 @@
-import { Either, type Mapper, type IEither } from "@emprespresso/pengueno";
+import { Either, type Mapper, type IEither } from '@emprespresso/pengueno';
-export const isArgKey = <K extends string>(k: string): k is K =>
- k.startsWith("--");
+export const isArgKey = <K extends string>(k: string): k is K => k.startsWith('--');
interface ArgHandler<V> {
absent?: V;
@@ -10,42 +9,42 @@ interface ArgHandler<V> {
}
export const getArg = <K extends string, V>(
- arg: K,
- argv: Array<string>,
- whenValue: ArgHandler<V>,
+ arg: K,
+ argv: Array<string>,
+ whenValue: ArgHandler<V>,
): IEither<Error, V> => {
- const value = argv.filter((_argv) => isArgKey(_argv) && _argv.split("=")[0] === arg).map((_argv, i) => {
- const next = _argv.includes("=") ? _argv.split("=")[1] : argv.at(i + 1);
- if (next) {
- if (isArgKey(next)) return whenValue.unspecified;
- return whenValue.present(next);
- }
- return whenValue.unspecified;
- }).find(x => x) ?? whenValue.absent;
+ const value =
+ argv
+ .filter((_argv) => isArgKey(_argv) && _argv.split('=')[0] === arg)
+ .map((_argv, i) => {
+ const next = _argv.includes('=') ? _argv.split('=')[1] : argv.at(i + 1);
+ if (next) {
+ if (isArgKey(next)) return whenValue.unspecified;
+ return whenValue.present(next);
+ }
+ return whenValue.unspecified;
+ })
+ .find((x) => x) ?? whenValue.absent;
if (value === undefined) {
- return Either.left(new Error("no value specified for " + arg));
+ return Either.left(new Error('no value specified for ' + arg));
}
return Either.right(value);
};
type MappedArgs<
- Args extends ReadonlyArray<string>,
- Handlers extends Partial<Record<Args[number], ArgHandler<unknown>>>
+ Args extends ReadonlyArray<string>,
+ Handlers extends Partial<Record<Args[number], ArgHandler<unknown>>>,
> = {
- [K in Args[number]]: K extends keyof Handlers
- ? Handlers[K] extends ArgHandler<infer T>
- ? T
- : string
- : string;
+ [K in Args[number]]: K extends keyof Handlers ? (Handlers[K] extends ArgHandler<infer T> ? T : string) : string;
};
export const argv = <
- const Args extends ReadonlyArray<string>,
- const Handlers extends Partial<Record<Args[number], ArgHandler<unknown>>>
+ const Args extends ReadonlyArray<string>,
+ const Handlers extends Partial<Record<Args[number], ArgHandler<unknown>>>,
>(
args: Args,
handlers?: Handlers,
- argv = Deno.args,
+ argv = process.argv.slice(2),
): IEither<Error, MappedArgs<Args, Handlers>> => {
type Result = MappedArgs<Args, Handlers>;
@@ -53,20 +52,20 @@ export const argv = <
const processArg = (arg: Args[number]): IEither<Error, [Args[number], unknown]> => {
const handler = handlers?.[arg] ?? defaultHandler;
- return getArg(arg, argv, handler).mapRight(value => [arg, value] as const);
+ return getArg(arg, argv, handler).mapRight((value) => [arg, value] as const);
};
- const argResults = args.map(processArg);
-
- return argResults.reduce(
- (acc: IEither<Error, Partial<Result>>, current: IEither<Error, readonly [Args[number], unknown]>) => {
- return acc.flatMap(accValue =>
- current.mapRight(([key, value]) => ({
- ...accValue,
- [key]: value
- }))
- );
- },
- Either.right({} as Partial<Result>)
- ).mapRight(result => result as Result);
+ return args
+ .map(processArg)
+ .reduce(
+ (acc: IEither<Error, Partial<Result>>, current: IEither<Error, readonly [Args[number], unknown]>) =>
+ acc.flatMap((accValue) =>
+ current.mapRight(([key, value]) => ({
+ ...accValue,
+ [key]: value,
+ })),
+ ),
+ Either.right(<Partial<Result>>{}),
+ )
+ .mapRight((result) => <Result>result);
};