Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/bombshell-dev/configliere. A statically typed entry-point router for command-line applications
Something went wrong. Try again.
1.6 kB · 71 lines
TypeScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172import type { AnyStep, Input, Parser, Step, ToSteps } from "./types.ts";
export type Sequence<Values extends [unknown, ...unknown[]]> = & Parser<ToSteps<Values>> & { parsers: Parser[]; };
export function sequence<V1, V2>( p1: Parser<[Step<V1, unknown>]>, p2: Parser<[Step<V2, unknown>]>,): Sequence<[V1, V2]>;
export function sequence<V1, V2, V3>( p1: Parser<[Step<V1, unknown>]>, p2: Parser<[Step<V2, unknown>]>, p3: Parser<[Step<V3, unknown>]>,): Sequence<[V1, V2, V3]>;
export function sequence<V1, V2, V3, V4>( p1: Parser<[Step<V1, unknown>]>, p2: Parser<[Step<V2, unknown>]>, p3: Parser<[Step<V3, unknown>]>, p4: Parser<[Step<V4, unknown>]>,): Sequence<[V1, V2, V3, V4]>;
export function sequence( ...parsers: Parser<[AnyStep]>[]): Parser<[AnyStep, ...AnyStep[]]> & { parsers: Parser[] } { return { parsers, path: [], parse(input) { return step(parsers, 0, input, []); }, };}
function step( parsers: Parser<[AnyStep]>[], index: number, input: Input, data: unknown[], // deno-lint-ignore no-explicit-any): any { let result = parsers[index].parse(input);
if (!result.ok) return result;
let accumulated = [...data, result.data];
if (index < parsers.length - 1) { return { ok: true, path: [], value: result.value, data: result.data, remainder: result.remainder, parse(next: Input) { return step(parsers, index + 1, next, accumulated); }, }; }
return { ok: true, value: result.value, data: accumulated, remainder: result.remainder, };}