{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE FlexibleContexts #-}

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

Parser information for the default CLI parser.

@since 0.1.0.0
-}
module Iris.Cli.ParserInfo (cmdParserInfo) where

import Iris.Cli.Interactive (interactiveModeP)
import Iris.Cli.Internal (Cmd (..))
import Iris.Cli.Version (mkVersionParser)
import Iris.Settings (CliEnvSettings (..))

import Iris.Cli.Colour (colourOptionP)
import qualified Options.Applicative as Opt

{- |

@since 0.1.0.0
-}
cmdParserInfo :: forall cmd appEnv. CliEnvSettings cmd appEnv -> Opt.ParserInfo (Cmd cmd)
cmdParserInfo :: forall cmd appEnv.
CliEnvSettings cmd appEnv -> ParserInfo (Cmd cmd)
cmdParserInfo CliEnvSettings{appEnv
String
Maybe String
Maybe VersionSettings
Parser cmd
cliEnvSettingsAppName :: forall cmd appEnv. CliEnvSettings cmd appEnv -> Maybe String
cliEnvSettingsVersionSettings :: forall cmd appEnv.
CliEnvSettings cmd appEnv -> Maybe VersionSettings
cliEnvSettingsProgDesc :: forall cmd appEnv. CliEnvSettings cmd appEnv -> String
cliEnvSettingsHeaderDesc :: forall cmd appEnv. CliEnvSettings cmd appEnv -> String
cliEnvSettingsAppEnv :: forall cmd appEnv. CliEnvSettings cmd appEnv -> appEnv
cliEnvSettingsCmdParser :: forall cmd appEnv. CliEnvSettings cmd appEnv -> Parser cmd
cliEnvSettingsAppName :: Maybe String
cliEnvSettingsVersionSettings :: Maybe VersionSettings
cliEnvSettingsProgDesc :: String
cliEnvSettingsHeaderDesc :: String
cliEnvSettingsAppEnv :: appEnv
cliEnvSettingsCmdParser :: Parser cmd
..} =
    forall a. Parser a -> InfoMod a -> ParserInfo a
Opt.info
        ( forall a. Parser (a -> a)
Opt.helper
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Maybe VersionSettings -> Parser (a -> a)
mkVersionParser Maybe VersionSettings
cliEnvSettingsVersionSettings
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (Cmd cmd)
cmdP
        )
        forall a b. (a -> b) -> a -> b
$ forall a. Monoid a => [a] -> a
mconcat
            [ forall a. InfoMod a
Opt.fullDesc
            , forall a. String -> InfoMod a
Opt.header String
cliEnvSettingsHeaderDesc
            , forall a. String -> InfoMod a
Opt.progDesc String
cliEnvSettingsProgDesc
            ]
  where
    cmdP :: Opt.Parser (Cmd cmd)
    cmdP :: Parser (Cmd cmd)
cmdP = do
        InteractiveMode
cmdInteractiveMode <- Parser InteractiveMode
interactiveModeP
        cmd
cmdCmd <- Parser cmd
cliEnvSettingsCmdParser
        ColourOption
cmdColourOption <- Parser ColourOption
colourOptionP

        pure Cmd{cmd
ColourOption
InteractiveMode
cmdCmd :: cmd
cmdColourOption :: ColourOption
cmdInteractiveMode :: InteractiveMode
cmdColourOption :: ColourOption
cmdCmd :: cmd
cmdInteractiveMode :: InteractiveMode
..}