getopt-generics
Status
This library is experimental.
Usage
getopt-generics
tries to make it very simple to create executables that parse
command line options. All you have to do is to define a type and derive some
instances:
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
module Readme where
import Data.Typeable
import GHC.Generics
import System.Console.GetOpt.Generics
import System.Environment
data Options
= Options {
port :: Int,
daemonize :: Bool,
config :: Maybe FilePath
}
deriving (Show, GHC.Generics.Generic)
instance System.Console.GetOpt.Generics.Generic Options
instance HasDatatypeInfo Options
Then you can use getArguments
to create a command-line argument parser:
main :: IO ()
main = do
options <- getArguments
print (options :: Options)
This program has
- a non-optional
--port
flag with an integer argument,
- a boolean flag
--daemonize
,
- an optional flag
--config
expecting a file argument and
- a generic
--help
option.
Here’s in example of the program above in bash:
$ program --port 8080 --config some/path
Options {port = 8080, daemonize = False, config = Just "some/path"}
$ program --port 8080 --daemonize
Options {port = 8080, daemonize = True, config = Nothing}
$ program --port foo
not an integer: foo
$ program
missing option: --port=int
$ program --help
program
--port=integer
--daemonize
--config=string (optional)
Constraints
There are some constraints that the defined datatype has to fulfill:
- It has to have only one constructor,
- that constructor has to have field selectors (i.e. use record syntax) and
- all fields have to be of a type that has an instance for
Option
.
(Types declared with newtype
are allowed with the same constraints.)
Using Custom Field Types
It is possible to use custom field types by providing an instance for Option
.
Here’s an example:
data File = File FilePath
deriving (Show, Typeable)
instance Option File where
argumentType Proxy = "file"
parseArgument f = Just (File f)
data FileOptions
= FileOptions {
file :: File
}
deriving (Show, GHC.Generics.Generic)
instance System.Console.GetOpt.Generics.Generic FileOptions
instance HasDatatypeInfo FileOptions
-- Returns: FileOptions {file = File "some/file"}
getFileOptions :: IO FileOptions
getFileOptions = withArgs (words "--file some/file") getArguments