import { type Fn } from "@thi.ng/api/fn";
import type { ArgSpec, KVDict, KVMultiDict, Tuple } from "./api.js";
/**
 * Returns a full {@link ArgSpec} for a boolean flag. The mere presence of this
 * arg will enable the flag.
 *
 * @param spec -
 */
export declare const flag: <S extends Partial<ArgSpec<boolean>>>(spec: S) => S & {
    flag: true;
    default: boolean;
    group: string;
};
/**
 * Returns a full {@link ArgSpec} for a string value arg.
 *
 * @param spec -
 */
export declare const string: <S extends Partial<ArgSpec<string>>>(spec: S) => S & {
    coerce: Fn<string, string>;
    hint: string;
    group: string;
};
/**
 * Multi-arg version of {@link string}. Returns a full {@link ArgSpec} for a
 * multi string value arg. This argument can be provided mutiple times with
 * values collected into an array.
 *
 * @param spec -
 */
export declare const strings: <S extends Partial<ArgSpec<string[]> & {
    delim: string;
}>>(spec: S) => S & {
    coerce: Fn<string[], string[]>;
    hint: string;
    multi: true;
    group: string;
};
/**
 * Returns a full {@link ArgSpec} for a floating point value arg. The value
 * will be autoatically coerced into a number using {@link coerceFloat}.
 *
 * @param spec -
 */
export declare const float: <S extends Partial<ArgSpec<number>>>(spec: S) => S & {
    coerce: Fn<string, number>;
    hint: string;
    group: string;
};
/**
 * Returns a full {@link ArgSpec} for a single hex integer value arg. The value
 * will be autoatically coerced into a number using {@link coerceHexInt}.
 *
 * @param spec -
 */
export declare const hex: <S extends Partial<ArgSpec<number>>>(spec: S) => S & {
    coerce: Fn<string, number>;
    hint: string;
    group: string;
};
/**
 * Returns a full {@link ArgSpec} for a single integer value arg. The value
 * will be autoatically coerced into a number using {@link coerceInt}.
 *
 * @param spec -
 */
export declare const int: <S extends Partial<ArgSpec<number>>>(spec: S) => S & {
    coerce: Fn<string, number>;
    hint: string;
    group: string;
};
/**
 * Multi-arg version of {@link float}. Returns a full {@link ArgSpec} for a
 * multi floating point value arg. This argument can be provided mutiple times
 * with values being coerced into numbers and collected into an array.
 *
 * @param spec -
 */
export declare const floats: <S extends Partial<ArgSpec<number[]> & {
    delim: string;
}>>(spec: S) => S & {
    coerce: Fn<string[], number[]>;
    hint: string;
    multi: true;
    group: string;
};
/**
 * Multi-arg version of {@link hex}. Returns a full {@link ArgSpec} for a multi
 * hex integer value arg. This argument can be provided mutiple times with
 * values being coerced into numbers and collected into an array.
 *
 * @param spec -
 */
export declare const hexes: <S extends Partial<ArgSpec<number[]> & {
    delim: string;
}>>(spec: S) => S & {
    coerce: Fn<string[], number[]>;
    hint: string;
    multi: true;
    group: string;
};
/**
 * Multi-arg version of {@link int}. Returns a full {@link ArgSpec} for a multi
 * integer value arg. This argument can be provided mutiple times with values
 * being coerced into numbers and collected into an array.
 *
 * @param spec -
 */
export declare const ints: <S extends Partial<ArgSpec<number[]> & {
    delim: string;
}>>(spec: S) => S & {
    coerce: Fn<string[], number[]>;
    hint: string;
    multi: true;
    group: string;
};
/**
 * Returns full {@link ArgSpec} for a JSON value arg. The raw CLI value string
 * will be automcatically coerced using {@link coerceJson}.
 *
 * @param spec -
 */
export declare const json: <T, S extends Partial<ArgSpec<T>>>(spec: S) => S & {
    coerce: Fn<string, T>;
    hint: string;
    group: string;
};
/**
 * Returns full {@link ArgSpec} for an enum-like string value arg. The raw CLI
 * value string will be automcatically validated using {@link coerceOneOf}.
 *
 * @param opts -
 * @param spec -
 */
export declare const oneOf: <K extends string, S extends Partial<ArgSpec<K>>>(opts: readonly K[], spec: S) => S & {
    coerce: Fn<string, K>;
    hint: string;
    group: string;
} & {
    desc: string;
};
/**
 * Multi-arg version of {@link oneOf}. Returns full {@link ArgSpec} for multiple
 * enum-like string value args. The raw CLI value strings will be automcatically
 * validated using {@link coerceOneOf} and collected into an array.
 *
 * @param opts -
 * @param spec -
 */
export declare const oneOfMulti: <K extends string, S extends Partial<ArgSpec<K[]> & {
    delim: string;
}>>(opts: readonly K[], spec: S) => S & {
    coerce: Fn<string[], K[]>;
    hint: string;
    multi: true;
    group: string;
} & {
    desc: string;
};
/**
 * Returns a full {@link ArgSpec} for multiple `key=value` pair args, coerced
 * into a result object.
 *
 * @remarks
 * The default delimiter (`=`) can be overridden. Also by default, key-only args
 * are allowed and will receive a `"true"` as their value. However, if `strict`
 * is true, only full KV pairs are allowed.
 *
 * @param spec -
 * @param delim -
 */
export declare const kvPairs: <S extends Partial<ArgSpec<KVDict>>>(spec: S, delim?: string, strict?: boolean) => S & {
    coerce: Fn<string[], KVDict>;
    hint: string;
    multi: true;
    group: string;
};
/**
 * Like {@link kvPairs}, but coerces KV pairs into a result {@link KVMultiDict}
 * which supports multiple values per given key (each key's values are collected
 * into arrays).
 *
 * @param spec -
 * @param delim -
 * @param strict -
 */
export declare const kvPairsMulti: <S extends Partial<ArgSpec<KVMultiDict>>>(spec: S, delim?: string, strict?: boolean) => S & {
    coerce: Fn<string[], KVMultiDict>;
    hint: string;
    multi: true;
    group: string;
};
/**
 * Returns a full {@link ArgSpec} for a fixed `size` tuple extracted from a
 * single value string. The individual values are delimited by `delim` and will
 * be coerced into their target type via `coerce`. The result tuple will be
 * wrapped in a {@link Tuple} instance.
 *
 * @remarks
 * An error will be thrown if the number of extracted values differs from the
 * specified tuple size or any value coercion fails.
 *
 * @example
 * ```ts tangle:../export/tuple.ts
 * import { coerceInt, parse, tuple } from "@thi.ng/args";
 *
 * console.log(
 *   parse({ a: tuple(coerceInt, 2, {})}, ["--a", "1,2"])
 * );
 * // {
 * //   result: { a: Tuple { value: [1, 2] } },
 * //   index: 2,
 * //   rest: [],
 * //   done: true
 * // }
 * ```
 *
 * @param coerce -
 * @param size -
 * @param spec -
 * @param delim -
 */
export declare const tuple: <T, S extends Partial<ArgSpec<Tuple<T>>>>(coerce: Fn<string, T>, size: number, spec: S, delim?: string) => S & {
    coerce: Fn<string, Tuple<T>>;
    hint: string;
    group: string;
};
/**
 * Syntax sugar for `tuple(coerceInt, size, {...}, delim)`.
 *
 * @param size -
 * @param spec -
 * @param delim -
 */
export declare const size: <S extends Partial<ArgSpec<Tuple<number>>>>(size: number, spec: S, delim?: string) => S & {
    coerce: Fn<string, Tuple<number>>;
    hint: string;
    group: string;
};
/**
 * Syntax sugar for `tuple(coerceFloat, size, {...}, delim)`.
 *
 * @param size -
 * @param spec -
 * @param delim -
 */
export declare const vec: <S extends Partial<ArgSpec<Tuple<number>>>>(size: number, spec: S, delim?: string) => S & {
    coerce: Fn<string, Tuple<number>>;
    hint: string;
    group: string;
};
//# sourceMappingURL=args.d.ts.map