-- | Options parser for the docvim executable.
module Text.Docvim.Options (Options(..), options) where

import Options.Applicative
import Data.Version
import qualified Paths_docvim

-- TODO: figure out where (and if!) to expand ~ and such in path options
data Options = Options
  { outfiles :: Maybe [FilePath]
  , debug :: Bool
  , directory :: String
  , verbose :: Bool }

parseOutfiles :: Parser [String]
parseOutfiles = some $ argument str
  (  metavar "OUTFILES..."
  <> help (unlines [ "Target file(s) for generated output"
                   , "(default: standard output)" ]))

version :: Parser (a -> a)
version = infoOption (showVersion Paths_docvim.version)
  (  long "version"
  <> help "Print version information" )

parseDebug :: Parser Bool
parseDebug = switch
  $  long "debug"
  <> short 'd'
  <> help "Print debug information during processing"

parseDirectory :: Parser String
parseDirectory = strOption
  $  long "directory"
  <> short 'c'
  <> metavar "DIRECTORY"
  <> value "."
  <> showDefault
  <> help "Change to DIRECTORY before processing"

parseVerbose :: Parser Bool
parseVerbose = switch
  $  long "verbose"
  <> short 'v'
  <> help "Be verbose during processing"

parseOptions :: Parser Options
parseOptions = Options
  <$> optional parseOutfiles
  <*> parseDebug
  <*> parseDirectory
  <*> parseVerbose

options :: IO Options
options = execParser $ info (helper <*> version <*> parseOptions)
  (  fullDesc
  <> progDesc "Generate documentation for a Vim plug-in"
  <> header "docvim - a documentation generator for Vim plug-ins" )