import { Result } from "@eeue56/ts-core/build/main/lib/result";
export declare type StringArgument = {
    kind: "StringArgument";
};
/**
 * An argument parser that treats an argument as a string
 */
export declare function string(): FlagArgument;
export declare type NumberArgument = {
    kind: "NumberArgument";
};
/**
 * An argument parser that treats an argument as a number
 */
export declare function number(): FlagArgument;
export declare type BooleanArgument = {
    kind: "BooleanArgument";
};
/**
 * An argument parser that treats an argument as a boolean
 */
export declare function boolean(): FlagArgument;
export declare type EmptyArgument = {
    kind: "EmptyArgument";
};
/**
 * An argument parser that always passes
 */
export declare function empty(): FlagArgument;
export declare type ListArgument = {
    kind: "ListArgument";
    items: FlagArgument[];
};
/**
 * An argument parser that treats an argument as a list
 */
export declare function list(flagArgumentParsers: FlagArgument[]): FlagArgument;
export declare type VariableListArgument = {
    kind: "VariableListArgument";
    item: FlagArgument;
};
/**
 * An argument parser that treats an argument as an enum
 */
export declare function oneOf(items: string[]): FlagArgument;
export declare type OneOfArgument = {
    kind: "OneOfArgument";
    items: string[];
};
/**
 * An argument parser that treats an argument as a list
 */
export declare function variableList(flagArgumentParser: FlagArgument): FlagArgument;
declare type KnownTypes = string | number | boolean | null | KnownTypes[];
export declare type FlagArgument = StringArgument | NumberArgument | BooleanArgument | EmptyArgument | ListArgument | VariableListArgument | OneOfArgument;
export declare type Short = {
    kind: "Short";
    name: string;
    help: string;
    parser: FlagArgument;
};
export declare type Long = {
    kind: "Long";
    name: string;
    help: string;
    parser: FlagArgument;
};
export declare type Both = {
    kind: "Both";
    shortName: string;
    longName: string;
    help: string;
    parser: FlagArgument;
};
export declare type Flag = Short | Long | Both;
/**
 * A short flag, like -y
 */
export declare function shortFlag(name: string, help: string, parser: FlagArgument): Short;
/**
 * A long flag, like --yes
 */
export declare function longFlag(name: string, help: string, parser: FlagArgument): Long;
/**
 * A short or long flag, like -y or --yes
 */
export declare function bothFlag(shortName: string, longName: string, help: string, parser: FlagArgument): Both;
/**
 * A program parser is composed of an array of flags
 */
export declare type ProgramParser = {
    flags: Flag[];
};
/**
 * A parser is composed of an array of flags
 */
export declare function parser(flags: Flag[]): ProgramParser;
/**
 * A Program contains all arguments given to it, and an record of all the flags
 */
export declare type Program = {
    args: string[];
    flags: Record<string, {
        isPresent: boolean;
        arguments: Result<string, KnownTypes>;
    }>;
};
/**
 * Creates a help text for a given program parser
 */
export declare function help(flagParser: ProgramParser): string;
/**
 * Reports all errors in a program, ignoring missing flags.
 */
export declare function allErrors(program: Program): string[];
/**
 * Reports missing flags, ignoring the ones you don't care about.
 */
export declare function allMissing(program: Program, ignore: string[]): string[];
/**
 * Runs a flag parser on the args
 */
export declare function parse(flagParser: ProgramParser, args: string[]): Program;
export {};
