nix-playgraound/notes/036-haskell-optparse-cli.md

1.7 KiB

Haskell optparse-applicative

This note covers 33-haskell-optparse-cli/, which parses a small deployment CLI with optparse-applicative.


1. Why This Is Different from the Parser-Combinator Example

12-haskell-parser-combinators/ builds a parser for a custom command language.

This example solves a different problem: parsing a conventional CLI with:

  • subcommands,
  • long options,
  • repeated options, and
  • typed option readers.

That is a common real-world Haskell task, and optparse-applicative is the standard tool for it.


2. What the Pure Parser Gives You

The example exposes:

runCliParser :: [String] -> Either String Command

Internally it uses execParserPure, which keeps the parsing logic testable without invoking IO or shelling out.

That is the main teaching point here: command-line parsing can still be structured as a pure transformation from argument vectors to typed commands.


3. What Makes the Example Non-Trivial

The parser handles two shapes of command:

  • validate, which parses typed environment, replica, and track options, and
  • promote, which parses repeated --owner flags plus a --dry-run switch.

That is enough surface area to show why a dedicated CLI parser library is useful.


4. Commands to Try

cd 33-haskell-optparse-cli

nix develop
cabal run
cabal run -- validate --service api --env production --replicas 3 --track stable
cabal run -- promote --service api --from-tag blue --to-tag green --owner platform --owner security --dry-run
cabal test

nix build
./result/bin/mini-cli validate --service api --env production --replicas 3 --track stable

nix run . -- validate --service api --env production --replicas 3 --track stable
nix flake check