opt-env-conf

Settings parsing for Haskell: command-line arguments, environment variables, and configuration values.

https://github.com/NorfairKing/opt-env-conf#readme

LTS Haskell 24.51:0.9.0.0
Stackage Nightly 2026-07-26:0.15.0.2
Latest on Hackage:0.15.0.2

See all snapshots opt-env-conf appears in

LGPL-3.0-only licensed by Tom Sydney Kerckhove
Maintained by [email protected]
This version can be pinned in stack with:opt-env-conf-0.15.0.2@sha256:c81f19139de27b821d0fb2f2add32228f4f0150affdc761812642bdb24cd15e1,1868

Changes

Changelog

[0.15.0.2] - 2026-05-15

Changed

  • Fixed an exponential-time blowup when parsing inputs with several many-style options combined with a choice containing positional arguments. Parses that previously took minutes now complete in milliseconds. The fix makes the internal ListT nondet stream lazy in its second argument and threads inner branches into the outer parser on demand.

[0.15.0.1] - 2026-03-18

Changed

  • Fixed autocompletion for paths containing .. components. Paths like ../, ../foo, and bar/../ now complete correctly.

[0.15.0.0] - 2026-03-17

Added

  • filePathWithExtension and filePathWithExtensions completers for completing only files with specific extensions.
  • CompletionResult and CompletionFinality types for per-result trailing-space suppression in zsh.

Changed

  • Breaking: Completer now wraps String -> IO [CompletionResult] instead of String -> IO [String]. Each result carries a CompletionFinality indicating whether it is final (e.g. a file — shell appends trailing space) or non-final (e.g. a directory — no trailing space). The zsh completion script uses this signal instead of the */ suffix heuristic.
  • withLocalYamlConfig (via configuredConfigFile) now completes only .yaml and .yml files instead of all files.
  • Fixed filePathSetting and directoryPathSetting so that user-provided builders (e.g. completer, metavar) take precedence over the built-in defaults instead of being silently overridden.
  • Fixed completion for options next to default commands with arguments. When a default command’s argument parser speculatively consumed a dashed option (e.g. --archive-dir) as a positional value, sibling parsers in the same applicative could no longer see it, suppressing their completers.

[0.14.1.0] - 2026-02-25

Added

  • renderSettingsNixOptionsWithGeneratedComment
  • renderParserNixOptionsWithGeneratedComment
  • withGeneratedComment

Changed

  • The --render-nix-options CLI output now includes a generated file comment

[0.14.0.0] - 2025-12-03

Changed

  • Source location package names are now cleaned up to not contain a hash. This makes it possible to use them in golden tests.

[0.13.0.0] - 2025-11-18

Added

  • Capability support for settings.

This is technically a breaking change, but if you don’t use any opt-env-conf internals, nothing should break for you.

Changed

  • Renamed requireCapability to checkWithRequiredCapability.
  • Fixed that showSettingABit did not show every part of a setting.

[0.12.2.0] - 2025-11-18

Changed

  • Fixed a bug in which parse errors would be ignored during checking as soon as one missing capability was encountered.

[0.12.0.0] - 2025-11-15

Added

  • Support for capabilities during settings parsing, and disabling them in the settings check.

This is technically a breaking change, but if you don’t use any opt-env-conf internals, nothing should break for you.

[0.11.1.0] - 2025-10-23

Added

  • Windows support by isolating platform-specific terminal code.

[0.11.0.0] - 2025-09-29

This is technically a breaking change, but if you don’t use any opt-env-conf internals, nothing should break for you.

Changed

  • ParserMany and ParserSome can now carry source locations. This is not likely to happen often because the Alternative class does not have a HasCallStack super class, but could still happen when using someNonEmpty.

[0.10.0.0] - 2025-09-17

This is technically a breaking change, but if you don’t use any opt-env-conf internals, nothing should break for you.

Added

  • unprefixedEnv
  • unprefixedConf

[0.9.0.0] - 2025-03-12

Added

  • Completions

[0.8.0.1] - 2024-12-22

Changed

  • Fixed that secretTextFileOrBareSetting would not pass the linter without name.

[0.8.0.0] - 2024-11-05

Changed

  • Change withShownDefault and valueWithShown to accept a function to use in place of show rather than a pre-rendered String.

[0.7.0.1] - 2024-10-27

Changed

  • Fixed a bug in which allOrNothing (and subSettings) could malfunction when using a common library setting multiple times.

[0.7.0.0] - 2024-10-27

Added

  • The allOrNothing error now shows which settings were defined.

[0.6.0.4] - 2024-10-26

Added

  • Added a lint for an unknown default command.

[0.6.0.3] - 2024-10-24

Added

  • withDefault and withShownDefault.

[0.6.0.2] - 2024-10-20

Changed

  • Fixed that configuration parsing errors were double-shown.

[0.6.0.1] - 2024-10-18

Added

  • secretTextFileSetting
  • secretTextFileOrBareSetting

[0.6.0.0] - 2024-10-18

Added

  • defaultCommand

Changed

  • commands now takes CommandsBuilders.

[0.5.1.1] - 2024-08-08

Changed

  • Fixed a bug in which a setting with only a default value was considered invalid.

[0.5.1.0] - 2024-08-08

Removed

  • Removed the “undecodable example” lint because it was faulty when example values aren’t Strings.

[0.5.0.1] - 2024-08-04

Changed

  • Errors involving commands now show command descriptions.

[0.5.0.0] - 2024-08-03

Changed

  • Made Builders contain a list of BuildInstructions so library functions can pattern-match on the builders.
  • yesNoSwitch and enableDisableSwitch now no longer take a default value, but accept default value builders instead.
  • Renamed ‘viaCodec’ to ‘viaStringCodec’.
  • Clearer lints when using name.
  • Clearer lint about loading configuration.
  • Default values are now shown at the end but before example values in documentation.
  • Proper [--optional-option-docs]

[0.4.0.5] - 2024-07-28

Added

  • Documentation now shows example values and default values.

[0.4.0.4] - 2024-07-28

Added

  • Added a lint for examples that none of the configuration codecs can decode.

Changed

  • Fixed: linter would ‘catch’ unreadable examples even though a setting would only read a configuration value

[0.4.0.3] - 2024-07-28

Changed

  • Support (commands [..] <|> commands [..]) by concat-ing the lists of commands.
  • Improved the documentation of parsers that use some.

[0.4.0.2] - 2024-07-27

Changed

  • Fixed a bug in which unrecognised arguments would be parsed exponentially.
  • The special --version command no longer allows any other arguments.
  • Fixed a bug in which some source locations still showed up even though debug mode was not on.
  • Fixed that only one codec for a configuration setting was tried.

[0.4.0.1] - 2024-07-26

Added

  • The viaCodec reader.

[0.4.0.0] - 2024-07-23

Added

  • Added a hidden --render-reference-documentation command.
  • Added a per-command --help page.

Changed

  • Changed the name of mkSettingsCheck to makeSettingsCheck.

[0.3.0.0] - 2024-07-19

Changed

  • Debug mode now provides much more info about all the settings that were and weren’t parsed, and why.
  • Fixed a bug in which arguments that were consumed in a failed branch were not being unconsumed afterwards.
  • Nix functions now produce completion as well as man pages.

[0.2.0.0] – 2024-07-18

Changed

  • Fixed that the settings check could not be run with arguments.
  • Added a lint to check that long isn’t used without option or switch.
  • Added a lint to check that many cannot be used with a parser that can succeed without consuming anything.

[0.1.0.0] - 2024-07-16

Changed

  • xdgYamlConfigFile now returns a Path Abs File instead of a FilePath.
  • Fixed a bug in withFirstYamlConfig and withCombinedYamlConfig in which the --config-file option was required.
  • --run-settings-check now allows you to define a static settings check.
  • Parse the combination of optional switches and optional arguments correctly.
  • Fail to parse if any arguments are leftover.

[0.0.0.0] - 2024-07-08

First version