{-# LANGUAGE CPP #-}
module SimpleCmdArgs
(simpleCmdArgs,
simpleCmdArgs',
simpleCmdArgsWithMods,
Subcommand(..),
subcommands,
strArg,
switchWith,
switchLongWith,
flagWith,
flagWith',
flagLongWith,
flagLongWith',
switchMods,
switchLongMods,
strOptionWith,
strOptionLongWith,
optionWith,
optionLongWith,
optionMods,
optionLongMods,
strOptionalWith,
strOptionalLongWith,
optionalWith,
optionalLongWith,
optionalMods,
optionalLongMods,
argumentWith,
Parser,
ReadM,
auto,
many,
eitherReader,
maybeReader,
optional,
some,
str,
(<|>),
#if !MIN_VERSION_base(4,8,0)
(<$>), (<*>)
#endif
)
where
#if !MIN_VERSION_base(4,13,0)
import Control.Applicative ((<|>),
#if !MIN_VERSION_base(4,8,0)
(<$>), (<*>)
#endif
)
#endif
import Control.Monad (join)
import Data.List (nub)
#if !MIN_VERSION_base(4,8,0)
import Data.Monoid (mconcat)
#endif
#if !MIN_VERSION_base(4,13,0)
import Data.Semigroup ((<>))
#endif
import Data.Version
import Debug.Trace (trace)
import Options.Applicative
simpleCmdArgs ::
Maybe Version
-> String
-> String
-> Parser (IO ())
-> IO ()
simpleCmdArgs :: Maybe Version -> String -> String -> Parser (IO ()) -> IO ()
simpleCmdArgs Maybe Version
mversion String
h String
pd =
Maybe Version -> InfoMod (IO ()) -> Parser (IO ()) -> IO ()
simpleCmdArgsWithMods Maybe Version
mversion forall {a}. InfoMod a
mods
where
mods :: InfoMod a
mods = forall {a}. InfoMod a
fullDesc forall a. Semigroup a => a -> a -> a
<> forall a. String -> InfoMod a
header String
h forall a. Semigroup a => a -> a -> a
<> forall a. String -> InfoMod a
progDesc String
pd
simpleCmdArgs'
:: Maybe Version
-> String
-> String
-> Parser (IO ())
-> IO ()
simpleCmdArgs' :: Maybe Version -> String -> String -> Parser (IO ()) -> IO ()
simpleCmdArgs' Maybe Version
mversion String
h String
pd =
Maybe Version -> InfoMod (IO ()) -> Parser (IO ()) -> IO ()
simpleCmdArgsWithMods Maybe Version
mversion forall {a}. InfoMod a
mods
where
mods :: InfoMod a
mods = forall {a}. InfoMod a
fullDesc forall a. Semigroup a => a -> a -> a
<> forall a. String -> InfoMod a
header String
h forall a. Semigroup a => a -> a -> a
<> forall a. String -> InfoMod a
progDesc String
pd forall a. Semigroup a => a -> a -> a
<> forall {a}. InfoMod a
noIntersperse
simpleCmdArgsWithMods ::
Maybe Version
-> InfoMod (IO ())
-> Parser (IO ())
-> IO ()
simpleCmdArgsWithMods :: Maybe Version -> InfoMod (IO ()) -> Parser (IO ()) -> IO ()
simpleCmdArgsWithMods Maybe Version
mversion InfoMod (IO ())
mods Parser (IO ())
cmdsParser = forall (m :: * -> *) a. Monad m => m (m a) -> m a
join forall a b. (a -> b) -> a -> b
$
forall a. ParserPrefs -> ParserInfo a -> IO a
customExecParser (PrefsMod -> ParserPrefs
prefs PrefsMod
showHelpOnEmpty)
(case Maybe Version
mversion of
(Just Version
version) -> forall a. Parser a -> InfoMod a -> ParserInfo a
info (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall {a}. Version -> Parser (a -> a)
versionOption Version
version forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (IO ())
cmdsParser) InfoMod (IO ())
mods
Maybe Version
Nothing -> forall a. Parser a -> InfoMod a -> ParserInfo a
info (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser (IO ())
cmdsParser) InfoMod (IO ())
mods)
where
versionOption :: Version -> Parser (a -> a)
versionOption Version
ver =
forall a. String -> Mod OptionFields (a -> a) -> Parser (a -> a)
infoOption (Version -> String
showVersion Version
ver) (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"version" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"Show version")
data Subcommand =
Subcommand String String (Parser (IO ()))
subCmdName :: Subcommand -> String
subCmdName :: Subcommand -> String
subCmdName (Subcommand String
n String
_ Parser (IO ())
_) = String
n
instance Eq Subcommand where
Subcommand
c1 == :: Subcommand -> Subcommand -> Bool
== Subcommand
c2 = Subcommand -> String
subCmdName Subcommand
c1 forall a. Eq a => a -> a -> Bool
== Subcommand -> String
subCmdName Subcommand
c2
instance Ord Subcommand where
compare :: Subcommand -> Subcommand -> Ordering
compare Subcommand
c1 Subcommand
c2 = forall a. Ord a => a -> a -> Ordering
compare (Subcommand -> String
subCmdName Subcommand
c1) (Subcommand -> String
subCmdName Subcommand
c2)
subcommands :: [Subcommand] -> Parser (IO ())
subcommands :: [Subcommand] -> Parser (IO ())
subcommands = forall a. Mod CommandFields a -> Parser a
hsubparser forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Monoid a => [a] -> a
mconcat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map Subcommand -> Mod CommandFields (IO ())
cmdToParse forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Subcommand] -> [Subcommand]
warnIfDuplicates
where
cmdToParse :: Subcommand -> Mod CommandFields (IO ())
cmdToParse (Subcommand String
name String
cmddesc Parser (IO ())
cmdparse) =
forall a. String -> ParserInfo a -> Mod CommandFields a
command String
name (forall a. Parser a -> InfoMod a -> ParserInfo a
info Parser (IO ())
cmdparse (forall a. String -> InfoMod a
progDesc String
cmddesc))
warnIfDuplicates :: [Subcommand] -> [Subcommand]
warnIfDuplicates :: [Subcommand] -> [Subcommand]
warnIfDuplicates [Subcommand]
subcmds =
if Bool
dups then forall a. String -> a -> a
trace String
"duplicate subcommand found" [Subcommand]
subcmds else [Subcommand]
subcmds
where
dups :: Bool
dups = forall a. Eq a => [a] -> [a]
nub [Subcommand]
subcmds forall a. Eq a => a -> a -> Bool
/= [Subcommand]
subcmds
strArg :: String -> Parser String
strArg :: String -> Parser String
strArg String
var = forall s. IsString s => Mod ArgumentFields s -> Parser s
strArgument (forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
var)
switchWith :: Char -> String -> String -> Parser Bool
switchWith :: Char -> String -> String -> Parser Bool
switchWith Char
s String
l String
h =
Mod FlagFields Bool -> Parser Bool
switch (forall (f :: * -> *) a.
HasName f =>
Char -> String -> String -> Mod f a
switchMods Char
s String
l String
h)
switchLongWith :: String -> String -> Parser Bool
switchLongWith :: String -> String -> Parser Bool
switchLongWith String
l String
h =
Mod FlagFields Bool -> Parser Bool
switch (forall (f :: * -> *) a. HasName f => String -> String -> Mod f a
switchLongMods String
l String
h)
flagWith :: a -> a -> Char -> String -> String -> Parser a
flagWith :: forall a. a -> a -> Char -> String -> String -> Parser a
flagWith a
off a
on Char
s String
l String
h =
forall a. a -> a -> Mod FlagFields a -> Parser a
flag a
off a
on (forall (f :: * -> *) a.
HasName f =>
Char -> String -> String -> Mod f a
switchMods Char
s String
l String
h)
flagWith' :: a -> Char -> String -> String -> Parser a
flagWith' :: forall a. a -> Char -> String -> String -> Parser a
flagWith' a
val Char
s String
l String
h =
forall a. a -> Mod FlagFields a -> Parser a
flag' a
val (forall (f :: * -> *) a.
HasName f =>
Char -> String -> String -> Mod f a
switchMods Char
s String
l String
h)
flagLongWith :: a -> a -> String -> String -> Parser a
flagLongWith :: forall a. a -> a -> String -> String -> Parser a
flagLongWith a
off a
on String
l String
h =
forall a. a -> a -> Mod FlagFields a -> Parser a
flag a
off a
on (forall (f :: * -> *) a. HasName f => String -> String -> Mod f a
switchLongMods String
l String
h)
flagLongWith' :: a -> String -> String -> Parser a
flagLongWith' :: forall a. a -> String -> String -> Parser a
flagLongWith' a
val String
l String
h =
forall a. a -> Mod FlagFields a -> Parser a
flag' a
val (forall (f :: * -> *) a. HasName f => String -> String -> Mod f a
switchLongMods String
l String
h)
switchMods :: HasName f =>
Char -> String -> String -> Mod f a
switchMods :: forall (f :: * -> *) a.
HasName f =>
Char -> String -> String -> Mod f a
switchMods Char
s String
l String
h =
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
s forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
l forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
h
switchLongMods :: HasName f =>
String -> String -> Mod f a
switchLongMods :: forall (f :: * -> *) a. HasName f => String -> String -> Mod f a
switchLongMods String
l String
h =
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
l forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
h
strOptionWith :: Char -> String -> String -> String -> Parser String
strOptionWith :: Char -> String -> String -> String -> Parser String
strOptionWith Char
s String
l String
meta String
h =
forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a.
(HasMetavar f, HasName f) =>
Char -> String -> String -> String -> Mod f a
optionMods Char
s String
l String
meta String
h)
strOptionLongWith :: String -> String -> String -> Parser String
strOptionLongWith :: String -> String -> String -> Parser String
strOptionLongWith String
l String
meta String
h =
forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a.
(HasMetavar f, HasName f) =>
String -> String -> String -> Mod f a
optionLongMods String
l String
meta String
h)
optionWith :: ReadM a -> Char -> String -> String -> String -> Parser a
optionWith :: forall a. ReadM a -> Char -> String -> String -> String -> Parser a
optionWith ReadM a
r Char
s String
l String
meta String
h =
forall a. ReadM a -> Mod OptionFields a -> Parser a
option ReadM a
r (forall (f :: * -> *) a.
(HasMetavar f, HasName f) =>
Char -> String -> String -> String -> Mod f a
optionMods Char
s String
l String
meta String
h)
optionLongWith :: ReadM a -> String -> String -> String -> Parser a
optionLongWith :: forall a. ReadM a -> String -> String -> String -> Parser a
optionLongWith ReadM a
r String
l String
meta String
h =
forall a. ReadM a -> Mod OptionFields a -> Parser a
option ReadM a
r (forall (f :: * -> *) a.
(HasMetavar f, HasName f) =>
String -> String -> String -> Mod f a
optionLongMods String
l String
meta String
h)
optionMods :: (HasMetavar f, HasName f) =>
Char -> String -> String -> String -> Mod f a
optionMods :: forall (f :: * -> *) a.
(HasMetavar f, HasName f) =>
Char -> String -> String -> String -> Mod f a
optionMods Char
s String
l String
meta String
h =
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
s forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
l forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
meta forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
h
optionLongMods :: (HasMetavar f, HasName f) =>
String -> String -> String -> Mod f a
optionLongMods :: forall (f :: * -> *) a.
(HasMetavar f, HasName f) =>
String -> String -> String -> Mod f a
optionLongMods String
l String
meta String
h =
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
l forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
meta forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
h
strOptionalWith :: Char -> String -> String -> String -> String -> Parser String
strOptionalWith :: Char -> String -> String -> String -> String -> Parser String
strOptionalWith Char
s String
l String
meta String
h String
d =
forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a.
(HasMetavar f, HasName f, HasValue f) =>
Char -> String -> String -> String -> a -> Mod f a
optionalMods Char
s String
l String
meta String
h String
d)
optionalWith :: ReadM a -> Char -> String -> String -> String -> a -> Parser a
optionalWith :: forall a.
ReadM a -> Char -> String -> String -> String -> a -> Parser a
optionalWith ReadM a
r Char
s String
l String
meta String
h a
d =
forall a. ReadM a -> Mod OptionFields a -> Parser a
option ReadM a
r (forall (f :: * -> *) a.
(HasMetavar f, HasName f, HasValue f) =>
Char -> String -> String -> String -> a -> Mod f a
optionalMods Char
s String
l String
meta String
h a
d)
strOptionalLongWith :: String -> String -> String -> String -> Parser String
strOptionalLongWith :: String -> String -> String -> String -> Parser String
strOptionalLongWith String
l String
meta String
h String
d =
forall s. IsString s => Mod OptionFields s -> Parser s
strOption (forall (f :: * -> *) a.
(HasMetavar f, HasName f, HasValue f) =>
String -> String -> String -> a -> Mod f a
optionalLongMods String
l String
meta (String
h forall a. Semigroup a => a -> a -> a
<> String
" [default: " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show String
d forall a. Semigroup a => a -> a -> a
<> String
"]") String
d)
optionalLongWith :: ReadM a -> String -> String -> String -> a -> Parser a
optionalLongWith :: forall a. ReadM a -> String -> String -> String -> a -> Parser a
optionalLongWith ReadM a
r String
l String
meta String
h a
d =
forall a. ReadM a -> Mod OptionFields a -> Parser a
option ReadM a
r (forall (f :: * -> *) a.
(HasMetavar f, HasName f, HasValue f) =>
String -> String -> String -> a -> Mod f a
optionalLongMods String
l String
meta String
h a
d)
optionalMods :: (HasMetavar f, HasName f, HasValue f) =>
Char -> String -> String -> String -> a -> Mod f a
optionalMods :: forall (f :: * -> *) a.
(HasMetavar f, HasName f, HasValue f) =>
Char -> String -> String -> String -> a -> Mod f a
optionalMods Char
s String
l String
meta String
h a
d =
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
s forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
l forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
meta forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
h forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasValue f => a -> Mod f a
value a
d
optionalLongMods :: (HasMetavar f, HasName f, HasValue f) =>
String -> String -> String -> a -> Mod f a
optionalLongMods :: forall (f :: * -> *) a.
(HasMetavar f, HasName f, HasValue f) =>
String -> String -> String -> a -> Mod f a
optionalLongMods String
l String
meta String
h a
d =
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
l forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
meta forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
h forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasValue f => a -> Mod f a
value a
d
argumentWith :: ReadM a -> String -> Parser a
argumentWith :: forall a. ReadM a -> String -> Parser a
argumentWith ReadM a
r String
meta =
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument ReadM a
r (forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
meta)