# ANN: Tackle.Opts - declarative command line arguments parser

**URL:** <https://forum.ada-lang.io/t/ann-tackle-opts-declarative-command-line-arguments-parser/4358>\
**Category:** Releases\
**Created:** [April 16, 2026, 6:46pm UTC](https://forum.ada-lang.io/t/ann-tackle-opts-declarative-command-line-arguments-parser/4358 "2026-04-16T18:46:50Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![tomekw](https://forum.ada-lang.io/user_avatar/forum.ada-lang.io/tomekw/32/883_2.png) [@tomekw](https://forum.ada-lang.io/u/tomekw)\
**Post date:** [April 16, 2026, 6:46pm UTC](https://forum.ada-lang.io/t/ann-tackle-opts-declarative-command-line-arguments-parser/4358/1 "2026-04-16T18:46:50Z")

</div>

I hope someone finds it useful:

### Options:

```ada
with Ada.Text_IO;
with Tackle.Opts;

procedure Opts_Demo is
   use Ada;
   use Tackle;

   Options : constant Opts.Option_List := [Opts.Arg ("alpha", 'a', "Do alpha stuff"),
                                           Opts.Arg ("beta", 'b', "Do beta stuff"),
                                           Opts.Flag ("charlie", 'c', "Has charlie flag")];

   Arguments : constant Opts.Argument_List := Opts.Consume_Arguments;

   Result : constant Opts.Result := Opts.Parse (Arguments, Options);
begin
   -- Help is implicit unless provided
   if Result.Has_Flag ("help") then
      Opts.Print_Usage ("opts_demo", Options);

      return;
   end if;

   Text_IO.Put_Line ("Alpha: " & Result.Arg ("alpha"));
   Text_IO.Put_Line ("Beta: " & Result.Arg ("beta"));
   Text_IO.Put_Line ("Charlie?: " & Result.Has_Flag ("charlie")'Image);
end Opts_Demo;

```

```shell
$ ./opts_demo --help
Usage: opts_demo [options]

Options:
  --alpha, -a <alpha> Do alpha stuff
  --beta, -b <beta> Do beta stuff
  --charlie, -c Has charlie flag

```

```shell
$ ./opts_demo --alpha Yes -b No --charlie
Alpha: Yes
Beta: No
Charlie?: TRUE

```

### Commands:

```ada
procedure Opts_Demo is
   use Ada;
   use Tackle;

   Commands : constant Opts.Command_List := [Opts.Cmd ("alpha", "Do alpha stuff",
                                                       [Opts.Flag ("yes", 'y', "Yes?")]),
                                             Opts.Cmd ("beta", "Do beta stuff",
                                                       [Opts.Arg ("foo", 'f', "Foo!")], Passthrough => True)];

   Arguments : constant Opts.Argument_List := Opts.Consume_Arguments;

   Result : constant Opts.Result := Opts.Parse (Arguments, Commands);
begin
   -- Help is implicit unless provided
   if Result.Cmd = "" or else
      Result.Has_Flag ("help")
   then
      Opts.Print_Usage (Result.Cmd, "opts_demo", Commands);

      return;
   end if;

   if Result.Cmd = "beta" then
      Text_IO.Put_Line ("Passthrough args: " & Result.Passthrough_Args'Image);
   end if;
end Opts_Demo;

```

```shell
$ ./opts_demo --help
Usage: opts_demo <command> [options]

Commands:
  alpha Do alpha stuff
  beta Do beta stuff

Run 'opts_demo <command> --help' for command options

```

```shell
$ ./opts_demo beta --help
Usage: opts_demo beta [options] [-- <args>]

Options:
  --foo, -f <foo> Foo!
  -- <args> Passthrough arguments

```

```shell
$ ./opts_demo beta --foo Bar -- baz qux
Passthrough args:
["baz", "qux"]

```

> **[GitHub - tomekw/tackle: Tomek's Ada Class Library](https://github.com/tomekw/tackle?tab=readme-ov-file#tackleopts)**
>
> Tomek's Ada Class Library

---

<div class="post-metadata">

**Author:** ![JeremyGrosser](https://forum.ada-lang.io/user_avatar/forum.ada-lang.io/jeremygrosser/32/3_2.png) [@JeremyGrosser](https://forum.ada-lang.io/u/JeremyGrosser)\
**Post date:** [April 16, 2026, 8:51pm UTC](https://forum.ada-lang.io/t/ann-tackle-opts-declarative-command-line-arguments-parser/4358/2 "2026-04-16T20:51:48Z")

</div>

This looks great! I’d prefer it to be in a separate crate, rather than a big crate of miscellaneous things.
