{-# LANGUAGE NoImplicitPrelude #-}

-- | Functions to parse command line arguments for Stack's @upgrade@ command.

module Stack.Options.UpgradeParser
  ( upgradeOptsParser
  ) where

import         Options.Applicative
                 ( Parser, flag', help, idm, long, metavar, showDefault
                 , strOption, switch, value
                 )
import         Options.Applicative.Builder.Extra ( boolFlags )
import         Stack.Prelude
import         Stack.Upgrade
                 ( BinaryOpts (..), SourceOpts (..), UpgradeOpts (..) )

-- | Parse command line arguments for Stack's @upgrade@ command.

upgradeOptsParser ::
     Bool
     -- ^ The default for --[no]-only-local-bin

  -> Parser UpgradeOpts
upgradeOptsParser :: Bool -> Parser UpgradeOpts
upgradeOptsParser Bool
onlyLocalBin = Maybe BinaryOpts -> Maybe SourceOpts -> UpgradeOpts
UpgradeOpts
  forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall {a}. Parser (Maybe a)
sourceOnly forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser BinaryOpts
binaryOpts)
  forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (forall {a}. Parser (Maybe a)
binaryOnly forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional Parser SourceOpts
sourceOpts)
 where
  binaryOnly :: Parser (Maybe a)
binaryOnly = forall a. a -> Mod FlagFields a -> Parser a
flag' forall a. Maybe a
Nothing
    (  forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"binary-only"
    forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Do not use a source upgrade path."
    )
  sourceOnly :: Parser (Maybe a)
sourceOnly = forall a. a -> Mod FlagFields a -> Parser a
flag' forall a. Maybe a
Nothing
    (  forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"source-only"
    forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Do not use a binary upgrade path."
    )

  binaryOpts :: Parser BinaryOpts
binaryOpts = Maybe String
-> Bool
-> Bool
-> Maybe String
-> Maybe String
-> Maybe String
-> BinaryOpts
BinaryOpts
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (forall s. IsString s => Mod OptionFields s -> Parser s
strOption
          (  forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"binary-platform"
          forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Platform type for archive to download."
          forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"PLATFORM"
          ))
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
          (  forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"force-download"
          forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Download the latest available Stack executable, even if not \
                  \newer."
          )
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Bool -> String -> String -> Mod FlagFields Bool -> Parser Bool
boolFlags Bool
onlyLocalBin
          String
"only-local-bin"
          String
"downloading only to Stack's local binary directory"
          forall m. Monoid m => m
idm
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (forall s. IsString s => Mod OptionFields s -> Parser s
strOption
          (  forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"binary-version"
          forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Download a specific Stack version, even if already \
                  \installed."
          forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"VERSION"
          ))
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (forall s. IsString s => Mod OptionFields s -> Parser s
strOption
          (  forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"github-org"
          forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"GitHub organization name."
          forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"USER"
          ))
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (forall s. IsString s => Mod OptionFields s -> Parser s
strOption
          (  forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"github-repo"
          forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"GitHub repository name."
          forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"REPO"
          ))

  sourceOpts :: Parser SourceOpts
sourceOpts = Maybe (String, String) -> SourceOpts
SourceOpts
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (   ( \Bool
fromGit String
repo String
branch ->
                if Bool
fromGit
                  then forall a. a -> Maybe a
Just (String
repo, String
branch)
                  else forall a. Maybe a
Nothing
            )
        forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Mod FlagFields Bool -> Parser Bool
switch
              ( forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"git"
              forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Clone from Git instead of downloading from Hackage \
                      \(more dangerous)."
              )
        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall s. IsString s => Mod OptionFields s -> Parser s
strOption
              (  forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"git-repo"
              forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Clone from specified Git repository."
              forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"URL"
              forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasValue f => a -> Mod f a
value String
"https://github.com/commercialhaskell/stack"
              forall a. Semigroup a => a -> a -> a
<> forall a (f :: * -> *). Show a => Mod f a
showDefault
              )
        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall s. IsString s => Mod OptionFields s -> Parser s
strOption
              (  forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"git-branch"
              forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Clone from specified Git branch."
              forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"BRANCH"
              forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasValue f => a -> Mod f a
value String
"master"
              forall a. Semigroup a => a -> a -> a
<> forall a (f :: * -> *). Show a => Mod f a
showDefault
              )
        )