packages feed

wembley-0.1.0.0: src/Options.hs

module Options
( Format(..)
, Options(..)
, parser
) where

import Data.Monoid
import Options.Applicative

-- | Output formats.
data Format = FmtLatex    -- ^ LaTeX
            | FmtMarkdown -- ^ GitHub Flavoured Markdown

-- | Command-line options.
data Options = Options { getExtensions   :: String
                       , getProjectName  :: String
                       , getOutputFormat :: Format
                       , getOutputFile   :: String
                       , getRootDir      :: String }

-- | Textual representation of the Format type.
instance Show Format where
  show FmtLatex    = "latex"
  show FmtMarkdown = "markdown"

-- | Parse a output format name.
formatReader :: String               -- ^ input
             -> Either String Format -- ^ error message | format
formatReader "latex"    = Right FmtLatex
formatReader "markdown" = Right FmtMarkdown
formatReader _          = Left "Format not supported"

-- | Relevant file extensions options.
optionExtensions :: Parser String -- ^ parser
optionExtensions = strOption
   $ short   'e'
  <> long    "extensions"
  <> value   "hs"
  <> metavar "EXTS"
  <> help    "Comma-separated list of relevant file extensions"
  <> showDefault

-- | Project name option.
optionProjectName :: Parser String -- ^ parser
optionProjectName = strOption
   $ short   'n'
  <> long    "name"
  <> metavar "NAME"
  <> help    "Name of the codebase. Appears in footers and as a title"

-- | Output file location option.
optionOutputFile :: Parser String -- ^ parser
optionOutputFile = strOption
   $ short   'o'
  <> long    "output"
  <> metavar "PATH"
  <> help    "Location of the resulting document"

-- | Output format option.
optionOutputFormat :: Parser Format -- ^ parser
optionOutputFormat = option (eitherReader formatReader)
   $ short   'f'
  <> long    "format"
  <> value   FmtLatex
  <> metavar "FORMAT"
  <> help    "Format of the resulting document, supported: latex, markdown"
  <> showDefault

-- | Root source directory option.
optionRootDir :: Parser String -- ^ parser
optionRootDir = strOption
   $ short   'd'
  <> long    "root-dir"
  <> value   "."
  <> metavar "PATH"
  <> help    "Root source directory path"
  <> showDefault

-- | Command-line user interface.
optionsParser :: Parser Options -- ^ parser
optionsParser = Options
  <$> optionExtensions
  <*> optionProjectName
  <*> optionOutputFormat
  <*> optionOutputFile
  <*> optionRootDir

-- | Description of the utility.
optionsDescription :: InfoMod Options -- ^ parser description
optionsDescription =
     header "wembley - pretty-print a whole codebase into a document"
  <> fullDesc

-- | Parser of the command-line options.
parser :: ParserInfo Options -- ^ parser
parser = info (helper <*> optionsParser) optionsDescription