{- |
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
        ( Int -> ColourOption -> ShowS
[ColourOption] -> ShowS
ColourOption -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ColourOption] -> ShowS
$cshowList :: [ColourOption] -> ShowS
show :: ColourOption -> String
$cshow :: ColourOption -> String
showsPrec :: Int -> ColourOption -> ShowS
$cshowsPrec :: Int -> ColourOption -> ShowS
Show
          -- ^ @since 0.1.0.0
        , ColourOption -> ColourOption -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ColourOption -> ColourOption -> Bool
$c/= :: ColourOption -> ColourOption -> Bool
== :: ColourOption -> ColourOption -> Bool
$c== :: ColourOption -> ColourOption -> Bool
Eq
          -- ^ @since 0.1.0.0
        , Eq ColourOption
ColourOption -> ColourOption -> Bool
ColourOption -> ColourOption -> Ordering
ColourOption -> ColourOption -> ColourOption
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ColourOption -> ColourOption -> ColourOption
$cmin :: ColourOption -> ColourOption -> ColourOption
max :: ColourOption -> ColourOption -> ColourOption
$cmax :: ColourOption -> ColourOption -> ColourOption
>= :: ColourOption -> ColourOption -> Bool
$c>= :: ColourOption -> ColourOption -> Bool
> :: ColourOption -> ColourOption -> Bool
$c> :: ColourOption -> ColourOption -> Bool
<= :: ColourOption -> ColourOption -> Bool
$c<= :: ColourOption -> ColourOption -> Bool
< :: ColourOption -> ColourOption -> Bool
$c< :: ColourOption -> ColourOption -> Bool
compare :: ColourOption -> ColourOption -> Ordering
$ccompare :: ColourOption -> ColourOption -> Ordering
Ord
          -- ^ @since 0.1.0.0
        , Int -> ColourOption
ColourOption -> Int
ColourOption -> [ColourOption]
ColourOption -> ColourOption
ColourOption -> ColourOption -> [ColourOption]
ColourOption -> ColourOption -> ColourOption -> [ColourOption]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: ColourOption -> ColourOption -> ColourOption -> [ColourOption]
$cenumFromThenTo :: ColourOption -> ColourOption -> ColourOption -> [ColourOption]
enumFromTo :: ColourOption -> ColourOption -> [ColourOption]
$cenumFromTo :: ColourOption -> ColourOption -> [ColourOption]
enumFromThen :: ColourOption -> ColourOption -> [ColourOption]
$cenumFromThen :: ColourOption -> ColourOption -> [ColourOption]
enumFrom :: ColourOption -> [ColourOption]
$cenumFrom :: ColourOption -> [ColourOption]
fromEnum :: ColourOption -> Int
$cfromEnum :: ColourOption -> Int
toEnum :: Int -> ColourOption
$ctoEnum :: Int -> ColourOption
pred :: ColourOption -> ColourOption
$cpred :: ColourOption -> ColourOption
succ :: ColourOption -> ColourOption
$csucc :: ColourOption -> ColourOption
Enum
          -- ^ @since 0.1.0.0
        , ColourOption
forall a. a -> a -> Bounded a
maxBound :: ColourOption
$cmaxBound :: ColourOption
minBound :: ColourOption
$cminBound :: ColourOption
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 :: Parser ColourOption
colourOptionP = Parser ColourOption
alwaysP forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser ColourOption
neverP forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure ColourOption
Auto
  where
    alwaysP :: Parser ColourOption
alwaysP =
        forall a. a -> Mod FlagFields a -> Parser a
Opt.flag' ColourOption
Always (forall (f :: * -> *) a. HasName f => String -> Mod f a
Opt.long String
"colour" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
Opt.help String
"Always output colours")
            forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
Opt.flag' ColourOption
Always (forall (f :: * -> *) a. HasName f => String -> Mod f a
Opt.long String
"color" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. Mod f a
Opt.internal)

    neverP :: Parser ColourOption
neverP =
        forall a. a -> Mod FlagFields a -> Parser a
Opt.flag' ColourOption
Never (forall (f :: * -> *) a. HasName f => String -> Mod f a
Opt.long String
"no-colour" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
Opt.help String
"Never output colours")
            forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
Opt.flag' ColourOption
Never (forall (f :: * -> *) a. HasName f => String -> Mod f a
Opt.long String
"no-color" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. Mod f a
Opt.internal)
            forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
Opt.flag' ColourOption
Never (forall (f :: * -> *) a. HasName f => String -> Mod f a
Opt.long String
"disable-color" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. Mod f a
Opt.internal)
            forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall a. a -> Mod FlagFields a -> Parser a
Opt.flag' ColourOption
Never (forall (f :: * -> *) a. HasName f => String -> Mod f a
Opt.long String
"disable-coulor" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. Mod f a
Opt.internal)