packages feed

calligraphy-0.1.0: src/Calligraphy/Util/Optparse.hs

-- Adapted (stolen) from https://github.com/commercialhaskell/stack/blob/d8fc7a1344fdd2dd9227f419b0b06ae1e5d4ede6/src/Options/Applicative/Builder/Extra.hs

module Calligraphy.Util.Optparse (boolFlags) where

import Options.Applicative

-- | Enable/disable flags for a 'Bool'.
boolFlags ::
  -- | Default value
  Bool ->
  -- | Flag name
  String ->
  -- | Help suffix
  String ->
  Mod FlagFields Bool ->
  Parser Bool
boolFlags defaultValue name helpText =
  enableDisableFlags defaultValue True False name $
    concat
      [ helpText,
        " (default: ",
        if defaultValue then "enabled" else "disabled",
        ")"
      ]

-- | Enable/disable flags for any type.
enableDisableFlags ::
  -- | Default value
  a ->
  -- | Enabled value
  a ->
  -- | Disabled value
  a ->
  -- | Name
  String ->
  -- | Help suffix
  String ->
  Mod FlagFields a ->
  Parser a
enableDisableFlags defaultValue enabledValue disabledValue name helpText mods =
  enableDisableFlagsNoDefault enabledValue disabledValue name helpText mods
    <|> pure defaultValue

-- | Enable/disable flags for any type, without a default (to allow chaining with '<|>')
enableDisableFlagsNoDefault ::
  -- | Enabled value
  a ->
  -- | Disabled value
  a ->
  -- | Name
  String ->
  -- | Help suffix
  String ->
  Mod FlagFields a ->
  Parser a
enableDisableFlagsNoDefault enabledValue disabledValue name helpText mods =
  last
    <$> some
      ( ( flag'
            enabledValue
            ( hidden
                <> internal
                <> long name
                <> mods
            )
            <|> flag'
              disabledValue
              ( hidden
                  <> internal
                  <> long ("no-" ++ name)
                  <> mods
              )
        )
          <|> flag'
            disabledValue
            ( long ("[no-]" ++ name)
                <> help helpText
                <> mods
            )
      )