{-# LANGUAGE NoImplicitPrelude #-}

{-|
Module      : Stack.Options.InitParser
Description : Parse arguments for Stack's @init@ and @new@ commands.
License     : BSD-3-Clause

Functions to parse command line arguments for Stack's @init@ and @new@ commands.
-}

module Stack.Options.InitParser
  ( initOptsParser
  ) where

import           Options.Applicative
                   ( Parser, completer, help, long, metavar, switch )
import           Options.Applicative.Builder.Extra
                   ( dirCompleter, textArgument )
import           Stack.Init ( InitOpts (..) )
import           Stack.Prelude

-- | Parse command line arguments for Stack's @init@ and @new@ commands.
initOptsParser :: Parser InitOpts
initOptsParser = InitOpts
  <$> searchDirs
  <*> omitPackages
  <*> overwrite
  <*> fmap not ignoreSubDirs
 where
  searchDirs = many (textArgument
    (  metavar "DIR(S)"
    <> completer dirCompleter
    <> help "Directory, or directories, to include in the search for Cabal \
            \files, when initialising. The default is the current directory."
    ))
  ignoreSubDirs = switch
    (  long "ignore-subdirs"
    <> help "Do not search for Cabal files in subdirectories, when \
            \initialising."
    )
  overwrite = switch
    (  long "force"
    <> help "Force an initialisation that overwrites any existing stack.yaml \
            \file."
    )
  omitPackages = switch
    (  long "omit-packages"
    <> help "Exclude conflicting or incompatible user packages, when \
            \initialising."
    )
