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.9 kB · 88 lines
TypeScript
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889import type { AnyStep, Input, Parser } from "./types.ts";import { object } from "./object.ts";import { format, inspect } from "./help.ts";import { assert } from "@std/assert";
export interface Program<P extends Parser<[AnyStep, ...AnyStep[]]>> { name: string; version?: string; config: P; createParser(input: Input): { type: "help"; print(): string; } | { type: "version"; print(): string; } | { type: "main"; parse(): ReturnType<P["parse"]>; };}
export function program<P extends Parser<[AnyStep, ...AnyStep[]]>>( opts: { name: string; version?: string; config: P; },): Program<P> { let { name, version, config } = opts;
return { name, version, config, createParser(input: Input): ReturnType<Program<P>["createParser"]> { const preamble = object({ help: { description: "show help", aliases: ["-h"], }, ...(version ? { version: { description: "show version", aliases: ["-v"], }, } : {}), });
let probe = preamble.parse(input); assert(probe.ok);
if (probe.value.help) { return { type: "help", print: () => printHelp(name, config, preamble) }; } if ((probe.value as { version?: boolean }).version) { return { type: "version", print: () => version!, }; }
return { type: "main", parse: () => config.parse(probe.remainder), // deno-lint-ignore no-explicit-any } as any; }, };}
// --- internal ---
function printHelp( name: string, config: Parser, preamble: Parser,): string { let info = inspect(config); let extra = inspect(preamble);
for (let opt of extra.opts) { info.opts.push(opt); }
return format(info, name);}