# Group Validators

Group validators operate on a set of parameters, ensuring that their values are mutually compatible. Cyclopts has some builtin common group validators in the cyclopts.validators module.

## LimitedChoice

Limits the number of specified arguments within the group. Most commonly used for mutually-exclusive arguments (default behavior).

    from cyclopts import App, Group, Parameter, validators
    from typing import Annotated

    app = App()

    vehicle = Group(
        "Vehicle (choose one)",
        default_parameter=Parameter(negative=""),  # Disable "--no-" flags
        validator=validators.LimitedChoice(),  # Mutually Exclusive Options
    )

    @app.default
    def main(
        *,
        car: Annotated[bool, Parameter(group=vehicle)] = False,
        truck: Annotated[bool, Parameter(group=vehicle)] = False,
    ):
        if car:
            print("I'm driving a car.")
        if truck:
            print("I'm driving a truck.")

    app()

    $ python drive.py --help
    Usage: main COMMAND [OPTIONS]

    ╭─ Commands ─────────────────────────────────────────────────────────╮
    │ --help -h  Display this message and exit.                          │
    │ --version  Display application version.                            │
    ╰────────────────────────────────────────────────────────────────────╯
    ╭─ Vehicle (choose one) ─────────────────────────────────────────────╮
    │ --car    [default: False]                                          │
    │ --truck  [default: False]                                          │
    ╰────────────────────────────────────────────────────────────────────╯

    $ python drive.py --car
    I'm driving a car.

    $ python drive.py --car --truck
    ╭─ Error ────────────────────────────────────────────────────────────╮
    │ Invalid values for group "Vehicle (choose one)". Mutually          │
    │ exclusive arguments: {--car, --truck}                              │
    ╰────────────────────────────────────────────────────────────────────╯

See the `LimitedChoice` docs for more info.

## MutuallyExclusive

Alias for `LimitedChoice` with default arguments. Exists primarily because the usage/implication will be more directly obvious and searchable to developers than `LimitedChoice`.