{-|
Module      : Git.Fmt.Options.Applicative.Parser
Description : Optparse utilities for the git-fmt command.

Copyright   : (c) Henry J. Wylde, 2015
License     : BSD3
Maintainer  : public@hjwylde.com

Optparse utilities for the git-fmt command.
-}

module Git.Fmt.Options.Applicative.Parser (
    -- * Optparse for GitFmt
    gitFmtPrefs, gitFmtInfo, gitFmt,
) where

import Data.List    (nub)
import Data.Version (showVersion)

import Options.Applicative

import Git.Fmt
import Git.Fmt.Version as This


-- | The default preferences.
--   Limits the help output to 100 columns.
gitFmtPrefs :: ParserPrefs
gitFmtPrefs = prefs $ columns 100

-- | An optparse parser of a git-fmt command.
gitFmtInfo :: ParserInfo Options
gitFmtInfo = info (infoOptions <*> gitFmt) fullDesc
    where
        infoOptions = helper <*> version <*> numericVersion
        version = infoOption ("Version " ++ showVersion This.version) $ mconcat [
            long "version", short 'V', hidden,
            help "Show this binary's version"
            ]
        numericVersion = infoOption (showVersion This.version) $ mconcat [
            long "numeric-version", hidden,
            help "Show this binary's version (without the prefix)"
            ]

-- | An options parser.
gitFmt :: Parser Options
gitFmt = Options
    <$> switch (mconcat [
        long "quiet", short 'q',
        help "Be quiet"
        ])
    <*> switch (mconcat [
        long "verbose", short 'v',
        help "Be verbose"
        ])
    <*> switch (mconcat [
        long "dry-run", short 'n',
        help "Doesn't perform any writes (useful with --list-ugly)"
        ])
    <*> switch (mconcat [
        long "list-ugly", short 'l',
        help "List all ugly files formatted"
        ])
    <*> fmap nub (many $ strArgument (mconcat [
        metavar "-- FILES..."
        ]))