License | BSD-style |
---|---|
Maintainer | Vincent Hanquez <[email protected]> |
Stability | experimental |
Portability | Good |
Safe Haskell | None |
Language | Haskell2010 |
Console.Options
Contents
Description
Options parsing using a simple DSL approach.
Using this API, your program should have the following shape:
defaultMain $ do f1 <- flag .. f2 <- argument .. action $ \toParam -> something (toParam f1) (toParam f2) ..
You can also define subcommand using:
defaultMain $ do subcommand "foo" $ do <..flags & parameters definitions...> action $ \toParam -> <..IO-action..> subcommand "bar" $ do <..flags & parameters definitions...> action $ \toParam -> <..IO-action..>
Example:
main = defaultMain $ do programName "test-cli" programDescription "test CLI program" flagA <- flag $ FlagShort 'a' <> FlagLong "aaa" allArgs <- remainingArguments "FILE" action $ \toParam -> do putStrLn $ "using flag A : " ++ show (toParam flagA) putStrLn $ "args: " ++ show (toParam allArgs)
Synopsis
- defaultMain :: OptionDesc (IO ()) () -> IO ()
- defaultMainWith :: OptionDesc (IO ()) () -> [String] -> IO ()
- parseOptions :: OptionDesc r () -> [String] -> (ProgramDesc r, OptionRes r)
- data OptionRes r
- data OptionDesc r a
- programName :: String -> OptionDesc r ()
- programVersion :: Version -> OptionDesc r ()
- programDescription :: String -> OptionDesc r ()
- command :: String -> OptionDesc r () -> OptionDesc r ()
- data FlagFrag
- flag :: FlagFrag -> OptionDesc r (Flag Bool)
- flagParam :: FlagFrag -> FlagParser a -> OptionDesc r (FlagParam a)
- flagMany :: OptionDesc r (FlagParam a) -> OptionDesc r (FlagMany a)
- argument :: String -> ValueParser a -> OptionDesc r (Arg a)
- remainingArguments :: String -> OptionDesc r (ArgRemaining [String])
- action :: Action r -> OptionDesc r ()
- description :: String -> OptionDesc r ()
- type Action r = (forall a p. Param p => p a -> Ret p a) -> r
- type ValueParser a = String -> Either String a
- data FlagParser a
- = FlagRequired (ValueParser a)
- | FlagOptional a (ValueParser a)
- data Flag a
- data FlagLevel a
- data FlagParam a
- data FlagMany a
- data Arg a
- data ArgRemaining a
- data Params
- paramsFlags :: Params -> [(Nid, Maybe String)]
- getParams :: Param p => Params -> forall a. p a -> Ret p a
Running
defaultMain :: OptionDesc (IO ()) () -> IO () Source #
run parse options description on the action
to be able to specify the arguments manually (e.g. pre-handling),
you can use defaultMainWith
.
>defaultMain dsl = getArgs >>= defaultMainWith dsl
defaultMainWith :: OptionDesc (IO ()) () -> [String] -> IO () Source #
same as defaultMain
, but with the argument
parseOptions :: OptionDesc r () -> [String] -> (ProgramDesc r, OptionRes r) Source #
This is only useful when you want to handle all the description parsing manually and need to not automatically execute any action or help/error handling.
Used for testing the parser.
return value of the option parser. only needed when using parseOptions
directly
Constructors
OptionSuccess Params (Action r) | |
OptionHelp | |
OptionError String | |
OptionInvalid String |
data OptionDesc r a Source #
Option description Monad
Instances
Description
programName :: String -> OptionDesc r () Source #
Set the program name
default is the result of base's getProgName
programVersion :: Version -> OptionDesc r () Source #
Set the program version
programDescription :: String -> OptionDesc r () Source #
Set the program description
command :: String -> OptionDesc r () -> OptionDesc r () Source #
Create a new sub command
Fragment of flag definition.
Use the monoid approach to concat flags together
e.g.
> FlagShort o
<> FlagLong "option"
Constructors
FlagShort Char | short option e.g. '-a' |
FlagLong String | long option e.g. "--aaaa" |
FlagDescription String | description of this flag. | FlagDefault String |
flag :: FlagFrag -> OptionDesc r (Flag Bool) Source #
Flag option either of the form -short or --long
for flag that expect a value (optional or mandatory), uses flagArg
flagParam :: FlagFrag -> FlagParser a -> OptionDesc r (FlagParam a) Source #
Flag option either of the form -short or --long
for flag that doesn't have parameter, use flag
flagMany :: OptionDesc r (FlagParam a) -> OptionDesc r (FlagMany a) Source #
Apply on a flagParam
to turn into a flag that can
be invoked multiples, creating a list of values
in the action.
argument :: String -> ValueParser a -> OptionDesc r (Arg a) Source #
An unnamed positional argument
For now, argument in a point of tree that contains sub trees will be ignored. TODO: record a warning or add a strict mode (for developping the CLI) and error.
remainingArguments :: String -> OptionDesc r (ArgRemaining [String]) Source #
All the remaining position arguments
This is useful for example for a program that takes an unbounded list of files as parameters.
action :: Action r -> OptionDesc r () Source #
Set the action to run in this command
description :: String -> OptionDesc r () Source #
Set the description for a command
Arguments
type ValueParser a = String -> Either String a Source #
A parser for a value. In case parsing failed Left should be returned.
data FlagParser a Source #
A parser for a flag's value, either optional or required.
Constructors
FlagRequired (ValueParser a) | flag value parser with a required parameter. |
FlagOptional a (ValueParser a) | Optional flag value parser: Default value if not present to a |
Represent a Flag that can be called multiples times and will increase a counter.
Represent a Flag with optional or required value that can be added multiple times
data ArgRemaining a Source #
All the remaining positional arguments