packages feed

hpack-dhall-0.6.0: exe/Options.hs

{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE RecordWildCards #-}

module Options
  ( Options (..)
  , parseNumericVersion
  , parseVersion
  , parseOptions
  , parsePkgYamlFile
  , parsePkgDhallFile
  , parseForce
  , parseQuiet
  , parserInfo
  , Command (..)

    -- ** Globs
  , GlobOptions (..)
  , parsePkgGlobs
  , parseIgnoreGlobs
  , parseGlobOptions
  ) where

import qualified Hpack.Config as HpackYaml (packageConfig)
import qualified Hpack.Dhall as HpackDhall (packageConfig)
import Options.Applicative

newtype Options = Options {pkgDhallFile :: FilePath}

data Command a = NumericVersion | Version | Run a

parserInfo :: Parser a -> String -> String -> ParserInfo (Command a)
parserInfo parseOpts h d =
  info parser $
    fullDesc
      <> header h
      <> progDesc d
  where
    parser =
      asum
        [ NumericVersion <$ parseNumericVersion
        , Version <$ parseVersion
        , Run <$> parseOpts
        ]

data GlobOptions = GlobOptions
  { force :: Bool
  , quiet :: Bool
  , pkgGlobs :: [String]
  , ignoreGlobs :: [String]
  }

parseGlobOptions :: String -> Parser GlobOptions
parseGlobOptions filename =
  helper <*> do
    force <- parseForce
    quiet <- parseQuiet
    pkgGlobs <- parsePkgGlobs filename
    ignoreGlobs <- parseIgnoreGlobs filename
    return GlobOptions{..}

parseOptions :: Parser Options
parseOptions =
  helper <*> do
    pkgDhallFile <- parsePkgDhallFile
    return Options{..}

parsePkgYamlFile :: Parser FilePath
parsePkgYamlFile =
  strOption $
    long "package-yaml"
      <> metavar "FILE"
      <> value HpackYaml.packageConfig
      <> showDefault
      <> help "A record of hpack fields"

parsePkgDhallFile :: Parser FilePath
parsePkgDhallFile =
  strOption $
    long "package-dhall"
      <> metavar "FILE"
      <> value HpackDhall.packageConfig
      <> showDefault
      <> help "A record of hpack fields"

parseNumericVersion :: Parser ()
parseNumericVersion =
  flag' () $
    long "numeric-version"
      <> help "Show version only"

parseVersion :: Parser ()
parseVersion =
  flag' () $
    long "version"
      <> help "Show app name and version"

parseForce :: Parser Bool
parseForce =
  flag False True $
    long "force"
      <> short 'f'
      <> help "Overwrite of the output .cabal file unnecessarily"

parseQuiet :: Parser Bool
parseQuiet =
  flag False True $
    long "silent"
      <> help "Suppress logging"

parsePkgGlobs :: String -> Parser [String]
parsePkgGlobs name =
  many . strOption $
    long (map (\c -> if c == '.' then '-' else c) name)
      <> metavar "GLOB"
      <> help ("Glob pattern to include when searching for '" ++ name ++ "' (or otherwise named) package files. Can be specified multiple times.")

parseIgnoreGlobs :: String -> Parser [String]
parseIgnoreGlobs name =
  many . strOption $
    long "ignore-glob"
      <> short 'i'
      <> metavar "GLOB"
      <> help ("Glob pattern to ignore when searching for '" ++ name ++ "' files. Can be specified multiple times.")