{-# LANGUAGE OverloadedStrings #-}
module Wordlist.Args
( Args (..), getArgs, argsNumber, argsDelimiter
, argsP
, defaultNumber, defaultDelimiter
, numberP, delimiterP
) where
import Control.Applicative (optional)
import Data.Maybe (fromMaybe)
import Data.Monoid ((<>))
import Data.Text (Text)
import Options.Applicative.Extra (execParser, helper)
import Options.Applicative.Types (Parser)
import qualified Data.Text as Text
import qualified Options.Applicative.Builder as Opt
data Args = Args
{ argsNumberMaybe :: Maybe Int
, argsDelimiterMaybe :: Maybe Text
}
defaultNumber :: Int
defaultNumber = 4
defaultDelimiter :: Text
defaultDelimiter = " "
numberP :: Parser (Maybe Int)
numberP =
optional $ Opt.option Opt.auto $
Opt.long "number" <> Opt.short 'n' <> Opt.help help
where
help = "Number of words (default: " <>
show defaultNumber <> ")"
delimiterP :: Parser (Maybe Text)
delimiterP =
optional $ Opt.option (fmap Text.pack Opt.str) $
Opt.long "delimiter" <> Opt.short 'd' <> Opt.help help
where
help = "Delimiter between words (default: space)"
argsP :: Parser Args
argsP =
Args <$> numberP <*> delimiterP
parserInfo :: Opt.InfoMod a
parserInfo =
Opt.header
"Generates random English words. Useful for password generation."
getArgs :: IO Args
getArgs =
execParser $ Opt.info (helper <*> argsP) parserInfo
argsNumber :: Args -> Int
argsNumber =
fromMaybe defaultNumber . argsNumberMaybe
argsDelimiter :: Args -> Text
argsDelimiter =
fromMaybe defaultDelimiter . argsDelimiterMaybe