packages feed

iris-0.1.0.0: src/Iris/Cli/Colour.hs

{- |
Module                  : Iris.Cli.Colour
Copyright               : (c) 2023 Dmitrii Kovanikov
SPDX-License-Identifier : MPL-2.0
Maintainer              : Dmitrii Kovanikov <kovanikov@gmail.com>
Stability               : Experimental
Portability             : Portable

CLI parser for the @--colour@ and @--no-colour@ options.

@since 0.1.0.0
-}
module Iris.Cli.Colour (
    ColourOption (..),
    colourOptionP,
) where

import Control.Applicative ((<|>))

import qualified Options.Applicative as Opt

{- | Data type that tells whether the user wants the colouring option enabled,
disabled or autodetected.

See 'colourOptionP' for the parser of this option.

@since 0.1.0.0
-}
data ColourOption
    = -- | @since 0.1.0.0
      Always
    | -- | @since 0.1.0.0
      Never
    | -- | @since 0.1.0.0
      Auto
    deriving stock
        ( Show
          -- ^ @since 0.1.0.0
        , Eq
          -- ^ @since 0.1.0.0
        , Ord
          -- ^ @since 0.1.0.0
        , Enum
          -- ^ @since 0.1.0.0
        , Bounded
          -- ^ @since 0.1.0.0
        )

{- | A CLI option parser for the desired coloured output mode in the terminal.

It parses @--colour@ and @--no-colour@ flags explicitly. Otherwise, it defaults
to 'Auto'.

@since 0.1.0.0
-}
colourOptionP :: Opt.Parser ColourOption
colourOptionP = alwaysP <|> neverP <|> pure Auto
  where
    alwaysP =
        Opt.flag' Always (Opt.long "colour" <> Opt.help "Always output colours")
            <|> Opt.flag' Always (Opt.long "color" <> Opt.internal)

    neverP =
        Opt.flag' Never (Opt.long "no-colour" <> Opt.help "Never output colours")
            <|> Opt.flag' Never (Opt.long "no-color" <> Opt.internal)
            <|> Opt.flag' Never (Opt.long "disable-color" <> Opt.internal)
            <|> Opt.flag' Never (Opt.long "disable-coulor" <> Opt.internal)