app/Options.hs
{-# LANGUAGE ApplicativeDo #-}
-- | Command line options for Importify
module Options
( ImportifyCliArgs (..)
, CommonOptions (..)
, Command (..)
, CabalCacheOptions (..)
, SingleFileOptions (..)
, parseOptions
) where
import Universum
import Options.Applicative (Parser, ParserInfo, auto, command, execParser, flag', fullDesc, help,
helper, info, long, metavar, option, progDesc, short, showDefault,
strArgument, strOption, subparser, switch, value)
import System.Wlog (Severity (Info))
import Importify.Main (OutputOptions (..))
data ImportifyCliArgs = ImportifyCliArgs
{ icaCommon :: !CommonOptions
, icaCommand :: !Command
} deriving (Show)
newtype CommonOptions = CommonOptions
{ coLoggingSeverity :: Severity -- ^ Severity for logger
} deriving (Show)
data Command
= SingleFile SingleFileOptions
| CabalCache CabalCacheOptions
deriving (Show)
data SingleFileOptions = SingleFileOptions
{ sfoFileName :: !FilePath -- ^ File where all redundant imports should be removed
, sfoOutput :: !OutputOptions -- ^ Options for @importify file@ output
} deriving (Show)
data CabalCacheOptions = CabalCacheOptions
{ ccoSaveSources :: !Bool -- ^ Don't delete downloaded package cache
, ccoDependencies :: ![Text] -- ^ Use specified dependencies overriding .cabal ones
} deriving (Show)
cliArgumentsParser :: Parser ImportifyCliArgs
cliArgumentsParser = do
icaCommon <- commonArgsParser
icaCommand <- commandParser
pure ImportifyCliArgs{..}
commonArgsParser :: Parser CommonOptions
commonArgsParser = do
coLoggingSeverity <- option auto $
metavar "SEVERITY"
<> long "logging-severity"
<> short 'l'
<> value Info
<> showDefault
<> help "Severity for logger"
pure CommonOptions{..}
commandParser :: Parser Command
commandParser = subparser $
command "file"
(info (helper <*> fileParser)
(fullDesc <> progDesc "Importify a single file."))
<> command "cache"
(info (helper <*> cacheParser)
(fullDesc <> progDesc
"Search for .cabal file in current directory. If it's found then cache \
\all dependencies for every target and store them inside ./.importify folder."))
fileParser :: Parser Command
fileParser = do
sfoFileName <- strArgument
$ metavar "FILE"
<> help "File to importify"
sfoOutput <- outputOptionsParser
pure (SingleFile SingleFileOptions{..})
where
outputOptionsParser :: Parser OutputOptions
outputOptionsParser =
flag' InPlace ( long "in-place"
<> short 'i'
<> help "Write changes directly to file")
<|> ToFile <$> strOption ( long "to"
<> short 't'
<> help "Write to specified file")
<|> pure ToConsole
cacheParser :: Parser Command
cacheParser = do
ccoSaveSources <- switch
$ long "preserve"
<> short 'p'
<> help "Don't remove downloaded package cache"
ccoDependencies <- many $ strOption
$ metavar "[STRING]"
<> long "dependency"
<> short 'd'
<> help "List of manually specified dependencies that should be used \
\for caching instead of libraries from .cabal file. This option \
\overrides default behavior."
pure (CabalCache CabalCacheOptions{..})
optsInfo :: ParserInfo ImportifyCliArgs
optsInfo = info
(helper <*> cliArgumentsParser)
(fullDesc <> progDesc "Importify - manage Haskell imports easily")
parseOptions :: IO ImportifyCliArgs
parseOptions = execParser optsInfo