{-# LANGUAGE ApplicativeDo #-} {- | Copyright: (c) 2020 Kowainik SPDX-License-Identifier: MPL-2.0 Maintainer: Kowainik 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'" ]