# baner

Flag parsing library in Typescript

Part of the [Hiraeth](https://github.com/eeue56/hiraeth) collection.

# Installation

```bash
npm install --save @eeue56/baner
```

# Core functionality

The library is built on the ideas:

- A command line library might have multiple flags
- Every flag should have help text
- Arguments to the command line are either: strings, numbers, booleans, or lists of those
- Types are good, let's do more of that.

[API docs](docs/src/baner.md)

# Example

```typescript
const helloParser = parser(
    longFlag("name", "The name to say hi to", string()),
    longFlag("age", "The age of the person", number()),
    longFlag("pets", "Names of your pets", variableList(string())),
    longFlag("type", "Type of owner", oneOf(["human", "alien"])),
    longFlag("pet-type", "Type of pets", variableList(oneOf(["cat", "dog"]))),
    bothFlag("h", "help", "This help text", empty()),
);

function sayHi(
    name: string,
    age: number,
    pets: string[],
    type: "human" | "alien",
    petTypes: Exclude<
        ProgramValuesOf<typeof helloParser>["pet-type"],
        undefined
    >,
): void {
    console.log(`Hi, ${name}! Congrats on being ${age} years old.`);
    if (type === "alien") console.log("Welcome to earth!");

    if (pets.length > 0) {
        console.log(
            `Wow, you had ${pets.length} pets. I bet ${pets.join(
                ", ",
            )} were good pets to have`,
        );
    }

    for (const petType of petTypes) {
        console.log("And it was a....", petType);
    }
}

function showHelp(program: ProgramOf<typeof helloParser>): void {
    console.log("Provide a name via --name and age via --age");
    console.log(help(helloParser));
    console.log("Supported flags:", program.flags);
}

const program = parse(helloParser, process.argv);

if (program.flags["help"].isPresent) {
    showHelp(program);
} else {
    const errors = allErrors(program);
    const missing = allMissing(program, ["help"]);
    const values = allValues(program);

    if (errors.length > 0) {
        console.log("Errors:");
        console.log(errors.join("\n"));
    } else if (missing.length > 0) {
        console.log("Missing flags:");
        console.log(missing.join("\n"));
    } else {
        sayHi(
            values.name!,
            values.age!,
            values.pets!,
            values.type!,
            values["pet-type"]!,
        );
    }
}
```

# Name

Baner means "flag" in Welsh. In English, you'd pronounce it as "ban-eh-eruh".
