| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
WithCli.Pure
Contents
- withCliPure :: WithCliPure function a => String -> [Modifier] -> [String] -> function -> Result a
- class WithCliPure function output
- data Result a
- = Success a
- | Errors String
- | OutputAndExit String
- handleResult :: Result a -> IO a
- class HasArguments a where
- argumentsParser :: Modifiers -> Maybe String -> Result (Parser Unnormalized a)
- atomicArgumentsParser :: forall a. Argument a => Modifiers -> Maybe String -> Result (Parser Unnormalized a)
- class Argument a where
- argumentType :: Proxy a -> String
- parseArgument :: String -> Maybe a
- data Modifier
- class Generic a
- class Typeable a
- data Proxy t :: k -> * = Proxy
Documentation
Arguments
| :: WithCliPure function a | |
| => String | |
| -> [Modifier] | |
| -> [String] | |
| -> function | The |
| -> Result a |
Pure variant of withCliModified.
class WithCliPure function output Source
Minimal complete definition
run
Instances
| WithCliPure output output Source | |
| (HasArguments input, WithCliPure function output) => WithCliPure (input -> function) output Source |
Type to wrap results from withCliPure.
Constructors
| Success a | The CLI was used correctly and a value of type |
| Errors String | The CLI was used incorrectly. The It can also happen that the data type you're trying to use isn't supported. See the README for details. |
| OutputAndExit String | The CLI was used with |
handleResult :: Result a -> IO a Source
Handles an input of type :Result a
- On
it returns the valueSuccessaa. - On
it writes the message toOutputAndExitmessagestdoutand throwsExitSuccess. - On
it writes the error messages toErrorserrsstderrand throws.ExitFailure1
This is used by withCli to handle parse results.
class HasArguments a where Source
Everything that can be used as an argument to your main function
(see withCli) needs to have a HasArguments instance.
HasArguments also allows to conjure up instances for record types
to create more complex command line interfaces. Here's an example:
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
import WithCli
data Options
= Options {
port :: Int,
daemonize :: Bool,
config :: Maybe FilePath
}
deriving (Show, Generic, HasArguments)
main :: IO ()
main = withCli run
run :: Options -> IO ()
run = printIn a shell this program behaves like this:
$ 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
cannot parse as INTEGER: foo
# exit-code 1
$ program
missing option: --port=INTEGER
# exit-code 1
$ program --help
program [OPTIONS]
--port=INTEGER
--daemonize
--config=STRING (optional)
-h --help show help and exitMinimal complete definition
Nothing
Methods
argumentsParser :: Modifiers -> Maybe String -> Result (Parser Unnormalized a) Source
Instances
| HasArguments Bool Source | |
| HasArguments Double Source | |
| HasArguments Float Source | |
| HasArguments Int Source | |
| HasArguments String Source | |
| Argument a => HasArguments [a] Source | |
| Argument a => HasArguments (Maybe a) Source | |
| (HasArguments a, HasArguments b) => HasArguments (a, b) Source | |
| (HasArguments a, HasArguments b, HasArguments c) => HasArguments (a, b, c) Source |
atomicArgumentsParser :: forall a. Argument a => Modifiers -> Maybe String -> Result (Parser Unnormalized a) Source
Useful for implementing your own instances of HasArguments on top
of a custom Argument instance.
Argument is a typeclass for things that can be parsed as atomic values from
single command line arguments, e.g. strings (and filenames) and numbers.
Occasionally you might want to declare your own instance for additional type safety and for providing a more informative command argument type. Here's an example:
{-# LANGUAGE DeriveDataTypeable #-}
import WithCli
data File = File FilePath
deriving (Show, Typeable)
instance Argument File where
argumentType Proxy = "custom-file-type"
parseArgument f = Just (File f)
instance HasArguments File where
argumentsParser = atomicArgumentsParser
main :: IO ()
main = withCli run
run :: File -> IO ()
run = printAnd this is how the above program behaves:
$ program --help program [OPTIONS] custom-file-type -h --help show help and exit $ program some/file File "some/file"
Modifiers
Modifiers can be used to customize the command line parser.
Constructors
| AddShortOption String Char |
|
| RenameOption String String |
|
| RenameOptions (String -> Maybe String) |
Can be used together with |
| UseForPositionalArguments String String |
|
| AddOptionHelp String String |
|
| AddVersionFlag String |
|
Useful Re-exports
class Generic a
Representable types of kind *. This class is derivable in GHC with the DeriveGeneric flag on.
Instances
| Generic Bool | |
| Generic Char | |
| Generic Double | |
| Generic Float | |
| Generic Int | |
| Generic Ordering | |
| Generic () | |
| Generic All | |
| Generic Any | |
| Generic Arity | |
| Generic Fixity | |
| Generic Associativity | |
| Generic [a] | |
| Generic (U1 p) | |
| Generic (Par1 p) | |
| Generic (ZipList a) | |
| Generic (Dual a) | |
| Generic (Endo a) | |
| Generic (Sum a) | |
| Generic (Product a) | |
| Generic (First a) | |
| Generic (Last a) | |
| Generic (Maybe a) | |
| Generic (I a) | |
| Generic (Either a b) | |
| Generic (Rec1 f p) | |
| Generic (a, b) | |
| Generic (Const a b) | |
| Generic (WrappedMonad m a) | |
| Generic (Proxy * t) | |
| Generic (K1 i c p) | |
| Generic ((:+:) f g p) | |
| Generic ((:*:) f g p) | |
| Generic ((:.:) f g p) | |
| Generic (a, b, c) | |
| Generic (WrappedArrow a b c) | |
| Generic (Alt k f a) | |
| Generic (K k a b) | |
| Generic (M1 i c f p) | |
| Generic (a, b, c, d) | |
| Generic (a, b, c, d, e) | |
| Generic ((:.:) l k f g p) | |
| Generic (a, b, c, d, e, f) | |
| Generic (a, b, c, d, e, f, g) |
class Typeable a
The class Typeable allows a concrete representation of a type to
be calculated.
Minimal complete definition
data Proxy t :: k -> *
A concrete, poly-kinded proxy type
Constructors
| Proxy |
Instances
| Monad (Proxy *) | |
| Functor (Proxy *) | |
| Applicative (Proxy *) | |
| Foldable (Proxy *) | |
| Traversable (Proxy *) | |
| Bounded (Proxy k s) | |
| Enum (Proxy k s) | |
| Eq (Proxy k s) | |
| Data t => Data (Proxy * t) | |
| Ord (Proxy k s) | |
| Read (Proxy k s) | |
| Show (Proxy k s) | |
| Ix (Proxy k s) | |
| Generic (Proxy * t) | |
| Monoid (Proxy k s) | |
| type Rep (Proxy k t) = D1 D1Proxy (C1 C1_0Proxy U1) | |
| type Code (Proxy * t0) = (:) [*] ([] *) ([] [*]) |