packages feed

extensions-0.0.0.0: app/Cli.hs

{-# LANGUAGE ApplicativeDo #-}

{- |
Copyright: (c) 2020 Kowainik
SPDX-License-Identifier: MPL-2.0
Maintainer: Kowainik <xrom.xkov@gmail.com>

CLI options for the @extensions@ exectuable.
-}

module Cli
    ( ExtensionsArgs (..)
    , Toggle (..)
    , runExtensionsCli
    ) where

import Options.Applicative (Parser, ParserInfo, execParser, flag, fullDesc, help, helper, info,
                            long, metavar, optional, progDesc, strOption)


-- | Options used for the main @extensions@ executable.
data ExtensionsArgs = ExtensionsArgs
    { -- | Path to cabal file
      extensionsArgsCabalFilePath  :: !(Maybe FilePath)
      -- | Path to module
    , extensionsArgsModuleFilePath :: !(Maybe FilePath)
      -- | When 'Disabled', do not check extensions in @.cabal@ file
    , extensionsArgsCabalToggle    :: !Toggle
      -- | When 'Disabled', print only @.cabal@ file's @default-extensions@
    , extensionsArgsModulesToggle  :: !Toggle
    }

data Toggle
    = Disabled
    | Enabled

-- | Run main parser of the @extensions@ command line tool.
runExtensionsCli :: IO ExtensionsArgs
runExtensionsCli = execParser extensionsCliParser

extensionsCliParser :: ParserInfo ExtensionsArgs
extensionsCliParser = info (helper <*> extensionsP) $
    fullDesc <> progDesc "Display Haskell Language Extensions"

-- | @extensions@ command parser.
extensionsP :: Parser ExtensionsArgs
extensionsP = do
    extensionsArgsCabalFilePath  <- filePathP "cabal" ".cabal file"
    extensionsArgsModuleFilePath <- filePathP "module" "Haskell module"
    extensionsArgsCabalToggle    <- noCabalP
    extensionsArgsModulesToggle  <- noModulesP
    pure ExtensionsArgs{..}

filePathP :: String -> String -> Parser (Maybe FilePath)
filePathP opt desc = optional $ strOption $ mconcat
    [ long $ opt <> "-file-path"
    , metavar "FILE_PATH"
    , help $ "Relative path to the " <> desc
    ]

noCabalP :: Parser Toggle
noCabalP = flag Enabled Disabled $ mconcat
    [ long "no-cabal"
    , help "Do not check extensions in the .cabal file"
    ]

noModulesP :: Parser Toggle
noModulesP = flag Enabled Disabled $ mconcat
    [ long "no-modules"
    , help "Print only .cabal file's 'default-extensions'"
    ]