module WithCli.Flag where
import Prelude ()
import Prelude.Compat
import Data.Monoid
import System.Console.GetOpt
data Flag a
= Help
| Version String
| NoHelp a
deriving (Functor)
instance Monoid a => Monoid (Flag a) where
mappend a b = case (a, b) of
(Help, _) -> Help
(_, Help) -> Help
(Version s, _) -> Version s
(_, Version s) -> Version s
(NoHelp a, NoHelp b) -> NoHelp (a <> b)
mempty = NoHelp mempty
foldFlags :: [Flag a] -> Flag [a]
foldFlags flags = mconcat $ map (fmap pure) flags
helpOption :: OptDescr (Flag a)
helpOption =
Option ['h'] ["help"] (NoArg Help) "show help and exit"
versionOption :: String -> OptDescr (Flag a)
versionOption version =
Option ['v'] ["version"] (NoArg (Version version)) "show version and exit"
usage :: String -> [String] -> [OptDescr ()] -> String
usage progName fields options = usageInfo header options
where
header :: String
header = unwords $
progName :
"[OPTIONS]" :
fields ++
[]