Optional arguments in Turtle.Option

This commit is contained in:
Index Int 2015-06-27 21:11:38 +03:00
parent 8c006a5242
commit 0596609a32
2 changed files with 26 additions and 13 deletions

View file

@ -15,6 +15,8 @@ module Turtle.Options
, parameter
, pAuto
, pText
, pInteger
, pDouble
) where
import Data.Monoid
@ -22,6 +24,7 @@ import Data.String (IsString)
import Text.Read (readMaybe)
import Data.Text (Text)
import qualified Data.Text as Text
import Data.Optional
import Control.Applicative
import Control.Monad.IO.Class
import Control.Monad.Trans.Reader
@ -45,30 +48,30 @@ newtype ShortName = ShortName { getShortName :: Char }
newtype HelpMessage = HelpMessage { getHelpMessage :: Text }
deriving (IsString)
optionalOr :: Monoid m => (a -> m) -> Optional a -> m
optionalOr _ Default = mempty
optionalOr f (Specific a) = f a
switch
:: LongName
-> ShortName
-> HelpMessage
-> Optional ShortName
-> Optional HelpMessage
-> Parser Bool
switch longName shortName helpMessage
= Opts.switch
$ Opts.long (Text.unpack (getLongName longName))
<> Opts.short (getShortName shortName)
<> Opts.help (Text.unpack (getHelpMessage helpMessage))
$ (Opts.long . Text.unpack . getLongName) longName
<> optionalOr (Opts.short . getShortName) shortName
<> optionalOr (Opts.help . Text.unpack . getHelpMessage) helpMessage
parameter
:: ParameterRead a
-> ParameterName
-> LongName
-> ShortName
-> HelpMessage
-> Optional HelpMessage
-> Parser a
parameter paramRead paramName longName shortName helpMessage
parameter paramRead paramName helpMessage
= Opts.option (parameterReadToReadM paramRead)
$ Opts.metavar (Text.unpack (getParameterName paramName))
<> Opts.long (Text.unpack (getLongName longName))
<> Opts.short (getShortName shortName)
<> Opts.help (Text.unpack (getHelpMessage helpMessage))
<> optionalOr (Opts.help . Text.unpack . getHelpMessage) helpMessage
newtype ParameterRead a = ParameterRead (ReaderT String Maybe a)
deriving (Functor, Applicative, Monad)
@ -82,6 +85,15 @@ pAuto = ParameterRead (ReaderT readMaybe)
pText :: ParameterRead Text
pText = ParameterRead (ReaderT $ \s -> Just (Text.pack s))
pInteger :: ParameterRead Integer
pInteger = pAuto
pInt :: ParameterRead Int
pInt = pAuto
pDouble :: ParameterRead Double
pDouble = pAuto
parameterReadToReadM :: ParameterRead a -> Opts.ReadM a
parameterReadToReadM (ParameterRead f) = do
s <- Opts.readerAsk

View file

@ -59,7 +59,8 @@ Library
text < 1.3,
time < 1.6,
transformers >= 0.2.0.0 && < 0.5,
optparse-applicative >= 0.11 && < 0.12
optparse-applicative >= 0.11 && < 0.12,
optional-args >= 1.0 && < 2.0
if os(windows)
Build-Depends: Win32 >= 2.2.0.1 && < 2.4
else