
```no_run
const DB: &str = "DATABASE_VAR";

#[derive(Debug, Clone, Bpaf)]
#[bpaf(options)]
pub struct Options {
    /// Use verbose output
    // No name annotation and name is not a single character:
    // `bpaf` uses it as a long name - `--verbose`
    pub verbose: bool,

    /// Compile in a release mode
    #[bpaf(short)]
    // Name is long, but explicit annotation for a short name
    // `bpaf` makes a short name from the first symbol: `-r`
    pub release: bool,

    /// Number of parallel jobs, defaults to # of CPUs
    // Explicit annotation with a short name: `-j`
    #[bpaf(short('j'))]
    pub threads: Option<usize>,

    /// Upload artifacts to the storage
    // Explicit annotation for a single suppresses the oher one,
    // but you can specify both of them. `-u` and `--upload`
    #[bpaf(short, long)]
    pub upload: bool,

    /// List of features to activate
    // you can mix explicit annotations with and without names
    // when convenient, here it's `-F` and `--features`
    #[bpaf(short('F'), long)]
    pub features: Vec<String>,

    /// Read information from the database
    #[bpaf(env(DB))]
    // Annotation for `env` does not affect annotation for names
    // so `bpaf` makes `--database` flag too
    pub database: String,

    /// Only print essential information
    #[bpaf(short, long, long("essential"))]
    // `--essential` is a hidden ailias, `-q` and `--quiet` are visible
    pub quiet: bool,

    /// implicit long + env variable "USER"
    #[bpaf(env("USER"))]
    pub user: String,
}

fn main() {
    println!("{:?}", options().run())
}
```


Output

`--help` output will contain first short and first long names that are present and won't have
anything about hidden aliases.

$ app --help

Usage: app [--verbose] [-r] [-j=ARG] [-u] [-F=ARG]... --database=ARG [-q] --user=ARG

Available options:

    --verbose

Use verbose output

-r

Compile in a release mode

-j=ARG

Number of parallel jobs, defaults to # of CPUs

-u, --upload

Upload artifacts to the storage

-F, --features=ARG

List of features to activate

    --database=ARG

Read information from the database

[env:DATABASE_VAR: N/A]

-q, --quiet

Only print essential information

    --user=ARG

implicit long + env variable "USER"

[env:USER = "pacak"]

-h, --help

Prints help information

`--essential` is a hidden alias and still works despite not being present in `--help` output
above

$ app --database default --essential
Options { verbose: false, release: false, threads: None, upload: false, features: [], database: "default", quiet: true, user: "pacak" }

And hidden means actually hidden. While error message can suggest to fix a typo to make it a
valid _visible_ argument

$ app --database default --quie
Error: no such flag: --quie, did you mean --quiet?

It will not do so for hidden aliases

$ app --database default --essentia
Error: --essentia is not expected in this context

