{-# LANGUAGE DeriveFunctor #-}
module Options.Harg.Types
( Opt (..),
OptionOpt (..),
FlagOpt (..),
ArgumentOpt (..),
OptAttr (..),
OptType (..),
SomeOpt (..),
OptReader,
HargCtx (..),
Environment,
getCtx,
ctxFromArgs,
ctxFromEnv,
pureCtx,
)
where
import System.Environment (getArgs, getEnvironment)
type OptReader a = String -> Either String a
data Opt a = Opt
{
_optLong :: Maybe String,
_optShort :: Maybe Char,
_optHelp :: Maybe String,
_optMetavar :: Maybe String,
_optEnvVar :: Maybe String,
_optDefaultVal :: Maybe a,
_optDefaultStr :: Maybe String,
_optReader :: OptReader a,
_optType :: OptType a
}
deriving (Functor)
data OptType a
= OptionOptType
|
FlagOptType a
| ArgumentOptType
deriving (Functor)
data OptAttr
= OptDefault
| OptOptional
data OptionOpt (attr :: [OptAttr]) a = OptionOpt
{ _oLong :: Maybe String,
_oShort :: Maybe Char,
_oHelp :: Maybe String,
_oMetavar :: Maybe String,
_oEnvVar :: Maybe String,
_oDefaultVal :: Maybe a,
_oDefaultStr :: Maybe String,
_oReader :: OptReader a
}
data FlagOpt (attr :: [OptAttr]) a = FlagOpt
{ _fLong :: Maybe String,
_fShort :: Maybe Char,
_fHelp :: Maybe String,
_fEnvVar :: Maybe String,
_fDefaultVal :: a,
_fReader :: OptReader a,
_fActive :: a
}
data ArgumentOpt (attr :: [OptAttr]) a = ArgumentOpt
{ _aHelp :: Maybe String,
_aMetavar :: Maybe String,
_aEnvVar :: Maybe String,
_aDefaultVal :: Maybe a,
_aDefaultStr :: Maybe String,
_aReader :: OptReader a
}
data SomeOpt where
SomeOpt :: Opt a -> SomeOpt
type Environment =
[(String, String)]
type Args =
[String]
data HargCtx = HargCtx
{ _hcEnv :: Environment,
_hcArgs :: Args
}
getCtx :: IO HargCtx
getCtx =
HargCtx <$> getEnvironment <*> getArgs
ctxFromArgs :: Args -> IO HargCtx
ctxFromArgs args =
HargCtx <$> getEnvironment <*> pure args
ctxFromEnv :: Environment -> IO HargCtx
ctxFromEnv env =
HargCtx env <$> getArgs
pureCtx :: Environment -> Args -> HargCtx
pureCtx =
HargCtx