{-# LANGUAGE LambdaCase                 #-}
{-# LANGUAGE MultiWayIf                 #-}
{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE RecordWildCards            #-}
{-# LANGUAGE ScopedTypeVariables        #-}
{-# LANGUAGE TupleSections              #-}

module HS.CLI.Parse where

import           HS.CLI.OptParse
import           HS.CLI.ToolArgs
import           HS.CLI.CLI
import           Options.Applicative


-- | parse the command line
parseCLI :: IO CLI
parseCLI :: IO CLI
parseCLI = (ToolArgs -> Psr CLI) -> IO CLI
forall a. (ToolArgs -> Psr a) -> IO a
parseArgs ToolArgs -> Psr CLI
cli_p

cli_p :: ToolArgs -> Psr CLI
cli_p :: ToolArgs -> Psr CLI
cli_p ToolArgs
tas = Mod CommandFields CLI -> Psr CLI
forall a. Mod CommandFields a -> Parser a
subparser (Mod CommandFields CLI -> Psr CLI)
-> Mod CommandFields CLI -> Psr CLI
forall a b. (a -> b) -> a -> b
$ [Mod CommandFields CLI] -> Mod CommandFields CLI
forall a. Monoid a => [a] -> a
mconcat
    [ String -> String -> Psr CLI -> Mod CommandFields CLI
forall a. String -> String -> Psr a -> Mod CommandFields a
cmd String
"version"           String
vrn (Psr CLI -> Mod CommandFields CLI)
-> Psr CLI -> Mod CommandFields CLI
forall a b. (a -> b) -> a -> b
$ CLI -> Psr CLI
forall (f :: * -> *) a. Applicative f => a -> f a
pure CLI
CLI_version
    , String -> String -> Psr CLI -> Mod CommandFields CLI
forall a. String -> String -> Psr a -> Mod CommandFields a
cmd String
"whereis"           String
whr (Psr CLI -> Mod CommandFields CLI)
-> Psr CLI -> Mod CommandFields CLI
forall a b. (a -> b) -> a -> b
$      Maybe InstallMode -> Compiler -> CLI
CLI_whereis       (Maybe InstallMode -> Compiler -> CLI)
-> Parser (Maybe InstallMode) -> Parser (Compiler -> CLI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Psr InstallMode -> Parser (Maybe InstallMode)
forall a. Psr a -> Psr (Maybe a)
opt Psr InstallMode
inmd_p Parser (Compiler -> CLI) -> Parser Compiler -> Psr CLI
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Compiler
cplr_p
    , String -> String -> Psr CLI -> Mod CommandFields CLI
forall a. String -> String -> Psr a -> Mod CommandFields a
cmd String
"run"               String
run (Psr CLI -> Mod CommandFields CLI)
-> Psr CLI -> Mod CommandFields CLI
forall a b. (a -> b) -> a -> b
$      Maybe InstallMode -> Tool -> ToolArgs -> CLI
CLI_run           (Maybe InstallMode -> Tool -> ToolArgs -> CLI)
-> Parser (Maybe InstallMode) -> Parser (Tool -> ToolArgs -> CLI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Psr InstallMode -> Parser (Maybe InstallMode)
forall a. Psr a -> Psr (Maybe a)
opt Psr InstallMode
inmd_p Parser (Tool -> ToolArgs -> CLI)
-> Parser Tool -> Parser (ToolArgs -> CLI)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Tool
tool_p Parser (ToolArgs -> CLI) -> Parser ToolArgs -> Psr CLI
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ToolArgs -> Parser ToolArgs
forall (f :: * -> *) a. Applicative f => a -> f a
pure ToolArgs
tas
    , String -> String -> Psr CLI -> Mod CommandFields CLI
forall a. String -> String -> Psr a -> Mod CommandFields a
cmd String
"list"              String
lst (Psr CLI -> Mod CommandFields CLI)
-> Psr CLI -> Mod CommandFields CLI
forall a b. (a -> b) -> a -> b
$      Maybe Compiler -> CLI
CLI_list              (Maybe Compiler -> CLI) -> Parser (Maybe Compiler) -> Psr CLI
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>            Parser Compiler -> Parser (Maybe Compiler)
forall a. Psr a -> Psr (Maybe a)
opt Parser Compiler
cplr_p
    , String -> String -> Psr CLI -> Mod CommandFields CLI
forall a. String -> String -> Psr a -> Mod CommandFields a
cmd String
"use"               String
use (Psr CLI -> Mod CommandFields CLI)
-> Psr CLI -> Mod CommandFields CLI
forall a b. (a -> b) -> a -> b
$      [Manager] -> CLI
CLI_use               ([Manager] -> CLI) -> Parser [Manager] -> Psr CLI
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>            Psr Manager -> Parser [Manager]
forall a. Psr a -> Psr [a]
mny Psr Manager
mngr_p
    , String -> String -> Psr CLI -> Mod CommandFields CLI
forall a. String -> String -> Psr a -> Mod CommandFields a
cmd String
"use-install-mode"  String
uim (Psr CLI -> Mod CommandFields CLI)
-> Psr CLI -> Mod CommandFields CLI
forall a b. (a -> b) -> a -> b
$      Maybe InstallMode -> CLI
CLI_use_install_mode  (Maybe InstallMode -> CLI) -> Parser (Maybe InstallMode) -> Psr CLI
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>            Psr InstallMode -> Parser (Maybe InstallMode)
forall a. Psr a -> Psr (Maybe a)
opt Psr InstallMode
imda_p
    , String -> String -> Psr CLI -> Mod CommandFields CLI
forall a. String -> String -> Psr a -> Mod CommandFields a
cmd String
"use-compiler"      String
ucp (Psr CLI -> Mod CommandFields CLI)
-> Psr CLI -> Mod CommandFields CLI
forall a b. (a -> b) -> a -> b
$      Maybe CompilerVersion -> CLI
CLI_use_compiler      (Maybe CompilerVersion -> CLI)
-> Parser (Maybe CompilerVersion) -> Psr CLI
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>            Psr CompilerVersion -> Parser (Maybe CompilerVersion)
forall a. Psr a -> Psr (Maybe a)
opt Psr CompilerVersion
cpvn_p
    , String -> String -> Psr CLI -> Mod CommandFields CLI
forall a. String -> String -> Psr a -> Mod CommandFields a
cmd String
"dump-ghc-wrappers" String
dgw (Psr CLI -> Mod CommandFields CLI)
-> Psr CLI -> Mod CommandFields CLI
forall a b. (a -> b) -> a -> b
$      Maybe InstallMode -> CLI
CLI_dump_ghc_wrappers (Maybe InstallMode -> CLI) -> Parser (Maybe InstallMode) -> Psr CLI
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>            Psr InstallMode -> Parser (Maybe InstallMode)
forall a. Psr a -> Psr (Maybe a)
opt Psr InstallMode
imda_p
    ]
  where
    vrn :: String
vrn = String
"print out the version of this program"
    whr :: String
whr = String
"identify the location of a (Compiler) compiler"
    run :: String
run = String
"run the designated (Compiler) compiler, installing needed and permitted, passing through the arguments"
    use :: String
use = String
"specify the priority of the sources of (Compiler) toolchain installations"
    lst :: String
lst = String
"list the visible (Compiler) toolchains"
    uim :: String
uim = String
"set the default install mode"
    ucp :: String
ucp = String
"set the default compiler"
    dgw :: String
dgw = String
"dump the named directory GHC tool wrappers the indirect through hs"

-- flags/switches

inmd_p :: Psr InstallMode
inmd_p :: Psr InstallMode
inmd_p = Psr InstallMode
forall a. EnumText a => Psr a
enum_switches_p

-- arguments

imda_p :: Psr InstallMode
imda_p :: Psr InstallMode
imda_p = String -> Psr InstallMode
forall a.
(Bounded a, Enum a, Buildable a, TextParsable a) =>
String -> Psr a
arg_et_p String
"<installation-mode>"

cplr_p :: Psr Compiler
cplr_p :: Parser Compiler
cplr_p = String -> String -> Parser Compiler
forall a. TextParsable a => String -> String -> Psr a
arg_p String
"<ghc-x.y.z>" String
"compiler to use"

cpvn_p :: Psr CompilerVersion
cpvn_p :: Psr CompilerVersion
cpvn_p = String -> String -> Psr CompilerVersion
forall a. TextParsable a => String -> String -> Psr a
arg_p String
"x.y.z" String
"version of the compiler to use"

tool_p :: Psr Tool
tool_p :: Parser Tool
tool_p = String -> String -> Parser Tool
forall a. TextParsable a => String -> String -> Psr a
arg_p String
"<tool-x.y.z>" String
"compiler to use"

mngr_p :: Psr Manager
mngr_p :: Psr Manager
mngr_p = String -> String -> Psr Manager
forall a. TextParsable a => String -> String -> Psr a
arg_p String
"<manager>" String
"manager of Compiler installation (stack|ghcup|...)"