{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
module WithCli (
withCli,
WithCli(),
HasArguments(argumentsParser),
atomicArgumentsParser,
Argument(argumentType, parseArgument),
withCliModified,
Modifier(..),
GHC.Generic,
Typeable,
Proxy(..),
) where
import Data.Proxy
import Data.Typeable
import qualified GHC.Generics as GHC
import System.Environment
import WithCli.Argument
import WithCli.HasArguments
import WithCli.Modifier
import WithCli.Parser
import qualified WithCli.Pure.Internal
import WithCli.Result
withCli :: WithCli main => main -> IO ()
withCli :: forall main. WithCli main => main -> IO ()
withCli = forall main. WithCli main => [Modifier] -> main -> IO ()
withCliModified []
withCliModified :: WithCli main => [Modifier] -> main -> IO ()
withCliModified :: forall main. WithCli main => [Modifier] -> main -> IO ()
withCliModified [Modifier]
mods main
main = do
[String]
args <- IO [String]
getArgs
Modifiers
modifiers <- forall a. Result a -> IO a
handleResult ([Modifier] -> Result Modifiers
mkModifiers [Modifier]
mods)
forall main a.
WithCli main =>
Modifiers
-> Result (Parser Unnormalized a)
-> (a -> main)
-> [String]
-> IO ()
run Modifiers
modifiers (forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a phase. a -> Parser phase a
emptyParser ()) (\ () -> main
main) [String]
args
class WithCli main where
run :: Modifiers -> Result (Parser Unnormalized a) -> (a -> main) -> [String] -> IO ()
instance WithCli (IO ()) where
run :: forall a.
Modifiers
-> Result (Parser Unnormalized a)
-> (a -> IO ())
-> [String]
-> IO ()
run Modifiers
modifiers Result (Parser Unnormalized a)
mkParser a -> IO ()
mkMain [String]
args = do
String
progName <- IO String
getProgName
let result :: Result (IO ())
result = forall function output input.
WithCliPure function output =>
String
-> Modifiers
-> Result (Parser Unnormalized input)
-> (input -> function)
-> [String]
-> Result output
WithCli.Pure.Internal.run
String
progName Modifiers
modifiers Result (Parser Unnormalized a)
mkParser a -> IO ()
mkMain [String]
args
IO ()
action <- forall a. Result a -> IO a
handleResult Result (IO ())
result
IO ()
action
instance (HasArguments a, WithCli rest) => WithCli (a -> rest) where
run :: forall a.
Modifiers
-> Result (Parser Unnormalized a)
-> (a -> a -> rest)
-> [String]
-> IO ()
run Modifiers
modifiers Result (Parser Unnormalized a)
fa a -> a -> rest
mkMain [String]
args =
forall main a.
WithCli main =>
Modifiers
-> Result (Parser Unnormalized a)
-> (a -> main)
-> [String]
-> IO ()
run Modifiers
modifiers (forall a b phase.
Result (Parser phase a)
-> Result (Parser phase b) -> Result (Parser phase (a, b))
combine Result (Parser Unnormalized a)
fa (forall a.
HasArguments a =>
Modifiers -> Maybe String -> Result (Parser Unnormalized a)
argumentsParser Modifiers
modifiers forall a. Maybe a
Nothing)) (\ (a
a, a
r) -> a -> a -> rest
mkMain a
a a
r) [String]
args