{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Stack.Options.DotParser where
import Data.Char (isSpace)
import Data.List.Split (splitOn)
import qualified Data.Set as Set
import qualified Data.Text as T
import Distribution.Types.PackageName(mkPackageName)
import Options.Applicative
import Options.Applicative.Builder.Extra
import Stack.Dot
import Stack.Options.BuildParser
import Stack.Prelude
dotOptsParser :: Bool -> Parser DotOpts
dotOptsParser externalDefault =
DotOpts <$> includeExternal
<*> includeBase
<*> depthLimit
<*> fmap (maybe Set.empty $ Set.fromList . splitNames) prunedPkgs
<*> targetsParser
<*> flagsParser
<*> testTargets
<*> benchTargets
<*> globalHints
where includeExternal = boolFlags externalDefault
"external"
"inclusion of external dependencies"
idm
includeBase = boolFlags True
"include-base"
"inclusion of dependencies on base"
idm
depthLimit =
optional (option auto
(long "depth" <>
metavar "DEPTH" <>
help ("Limit the depth of dependency resolution " <>
"(Default: No limit)")))
prunedPkgs = optional (strOption
(long "prune" <>
metavar "PACKAGES" <>
help ("Prune each package name " <>
"from the comma separated list " <>
"of package names PACKAGES")))
testTargets = switch (long "test" <>
help "Consider dependencies of test components")
benchTargets = switch (long "bench" <>
help "Consider dependencies of benchmark components")
splitNames :: String -> [PackageName]
splitNames = map (mkPackageName . takeWhile (not . isSpace) . dropWhile isSpace) . splitOn ","
globalHints = switch (long "global-hints" <>
help "Do not require an install GHC; instead, use a hints file for global packages")
separatorParser :: Parser Text
separatorParser =
fmap escapeSep
(textOption (long "separator" <>
metavar "SEP" <>
help ("Separator between package name " <>
"and package version.") <>
value " " <>
showDefault))
where escapeSep sep = T.replace "\\t" "\t" (T.replace "\\n" "\n" sep)
licenseParser :: Parser Bool
licenseParser = boolFlags False
"license"
"printing of dependency licenses instead of versions"
idm
listDepsFormatOptsParser :: Parser ListDepsFormatOpts
listDepsFormatOptsParser = ListDepsFormatOpts <$> separatorParser <*> licenseParser
listDepsTreeParser :: Parser ListDepsFormat
listDepsTreeParser = ListDepsTree <$> listDepsFormatOptsParser
listDepsTextParser :: Parser ListDepsFormat
listDepsTextParser = ListDepsText <$> listDepsFormatOptsParser
listDepsJsonParser :: Parser ListDepsFormat
listDepsJsonParser = pure ListDepsJSON
toListDepsOptsParser :: Parser ListDepsFormat -> Parser ListDepsOpts
toListDepsOptsParser formatParser = ListDepsOpts
<$> formatParser
<*> dotOptsParser True
formatSubCommand :: String -> String -> Parser ListDepsFormat -> Mod CommandFields ListDepsOpts
formatSubCommand cmd desc formatParser =
command cmd (info (toListDepsOptsParser formatParser)
(progDesc desc))
listDepsOptsParser :: Parser ListDepsOpts
listDepsOptsParser = subparser
( formatSubCommand "text" "Print dependencies as text (default)" listDepsTextParser
<> formatSubCommand "tree" "Print dependencies as tree" listDepsTreeParser
<> formatSubCommand "json" "Print dependencies as JSON" listDepsJsonParser
) <|> toListDepsOptsParser listDepsTextParser