Updated options module
Changed arg/opt parsing to return monomorphic values and made short name argument mandatory
This commit is contained in:
parent
c1a97ca50e
commit
c8d3ebed38
1 changed files with 37 additions and 39 deletions
|
@ -9,8 +9,8 @@
|
|||
-- > import Turtle
|
||||
-- >
|
||||
-- > parser :: Parser (Text, Int)
|
||||
-- > parser = (,) <$> optText "name" "Your first name"
|
||||
-- > <*> optIntegral "age" "Your current age"
|
||||
-- > parser = (,) <$> optText "name" 'n' "Your first name"
|
||||
-- > <*> optInt "age" 'a' "Your current age"
|
||||
-- >
|
||||
-- > main = do
|
||||
-- > (name, age) <- options "Greeting script" parser
|
||||
|
@ -41,15 +41,17 @@ module Turtle.Options
|
|||
-- * Flag-based option parsers
|
||||
, switch
|
||||
, optText
|
||||
, optIntegral
|
||||
, optFractional
|
||||
, optInt
|
||||
, optInteger
|
||||
, optDouble
|
||||
, optRead
|
||||
, opt
|
||||
|
||||
-- * Positional argument parsers
|
||||
, argText
|
||||
, argIntegral
|
||||
, argFractional
|
||||
, argInt
|
||||
, argInteger
|
||||
, argDouble
|
||||
, argRead
|
||||
, arg
|
||||
|
||||
|
@ -106,12 +108,13 @@ newtype HelpMessage = HelpMessage { getHelpMessage :: Text }
|
|||
-}
|
||||
switch
|
||||
:: ArgName
|
||||
-> Char
|
||||
-> Optional HelpMessage
|
||||
-> Parser Bool
|
||||
switch argName helpMessage
|
||||
switch argName c helpMessage
|
||||
= Opts.switch
|
||||
$ (Opts.long . Text.unpack . getArgName) argName
|
||||
<> foldMap (Opts.short . fst) (Text.uncons (getArgName argName))
|
||||
<> Opts.short c
|
||||
<> foldMap (Opts.help . Text.unpack . getHelpMessage) helpMessage
|
||||
|
||||
{- | Build a flag-based option parser for any type by providing a `Text`-parsing
|
||||
|
@ -119,38 +122,36 @@ switch argName helpMessage
|
|||
-}
|
||||
opt :: (Text -> Maybe a)
|
||||
-> ArgName
|
||||
-> Char
|
||||
-> Optional HelpMessage
|
||||
-> Parser a
|
||||
opt argParse argName helpMessage
|
||||
opt argParse argName c helpMessage
|
||||
= Opts.option (argParseToReadM argParse)
|
||||
$ Opts.metavar (Text.unpack (Text.toUpper (getArgName argName)))
|
||||
<> Opts.long (Text.unpack (getArgName argName))
|
||||
<> foldMap (Opts.short . fst) (Text.uncons (getArgName argName))
|
||||
<> Opts.short c
|
||||
<> foldMap (Opts.help . Text.unpack . getHelpMessage) helpMessage
|
||||
|
||||
-- | Parse any type that implements `Read`
|
||||
optRead :: Read a => ArgName -> Optional HelpMessage -> Parser a
|
||||
optRead :: Read a => ArgName -> Char -> Optional HelpMessage -> Parser a
|
||||
optRead = opt (readMaybe . Text.unpack)
|
||||
|
||||
{-| Parse any type that implements `Integral` as n flag-based option
|
||||
-- | Parse an `Int` as a flag-based option
|
||||
optInt :: ArgName -> Char -> Optional HelpMessage -> Parser Int
|
||||
optInt = optRead
|
||||
|
||||
This is most commonly used to parse an `Int` or `Integer`
|
||||
-}
|
||||
optIntegral :: Integral n => ArgName -> Optional HelpMessage -> Parser n
|
||||
optIntegral argName helpMessage = fmap fromInteger (optRead argName helpMessage)
|
||||
-- | Parse an `Integer` as a flag-based option
|
||||
optInteger :: ArgName -> Char -> Optional HelpMessage -> Parser Integer
|
||||
optInteger = optRead
|
||||
|
||||
-- | Parse a `Double` as a flag-based option
|
||||
optDouble :: ArgName -> Char -> Optional HelpMessage -> Parser Double
|
||||
optDouble = optRead
|
||||
|
||||
-- | Parse a `Text` value as a flag-based option
|
||||
optText :: ArgName -> Optional HelpMessage -> Parser Text
|
||||
optText :: ArgName -> Char -> Optional HelpMessage -> Parser Text
|
||||
optText = opt Just
|
||||
|
||||
{-| Parse any type that implements `Fractional` as a flag-based option
|
||||
|
||||
This is most commonly used to parse a `Double`
|
||||
-}
|
||||
optFractional :: Fractional n => ArgName -> Optional HelpMessage -> Parser n
|
||||
optFractional argName helpMessage =
|
||||
fmap fromRational (optRead argName helpMessage)
|
||||
|
||||
{- | Build a positional argument parser for any type by providing a
|
||||
`Text`-parsing function
|
||||
-}
|
||||
|
@ -167,25 +168,22 @@ arg argParse argName helpMessage
|
|||
argRead :: Read a => ArgName -> Optional HelpMessage -> Parser a
|
||||
argRead = arg (readMaybe . Text.unpack)
|
||||
|
||||
{-| Parse any type that implements `Integral` as a positional argument
|
||||
-- | Parse an `Int` as a positional argument
|
||||
argInt :: ArgName -> Optional HelpMessage -> Parser Int
|
||||
argInt = argRead
|
||||
|
||||
This is most commonly used to parse an `Int` or `Integer`
|
||||
-}
|
||||
argIntegral :: Integral n => ArgName -> Optional HelpMessage -> Parser n
|
||||
argIntegral argName helpMessage = fmap fromInteger (argRead argName helpMessage)
|
||||
-- | Parse an `Integer` as a positional argument
|
||||
argInteger :: ArgName -> Optional HelpMessage -> Parser Integer
|
||||
argInteger = argRead
|
||||
|
||||
-- | Parse a `Text` value as a positional argument
|
||||
-- | Parse a `Double` as a positional argument
|
||||
argDouble :: ArgName -> Optional HelpMessage -> Parser Double
|
||||
argDouble = argRead
|
||||
|
||||
-- | Parse a `Text` as a positional argument
|
||||
argText :: ArgName -> Optional HelpMessage -> Parser Text
|
||||
argText = arg Just
|
||||
|
||||
{-| Parse any type that implements `Fractional` as a positional argument
|
||||
|
||||
This is most commonly used to parse a `Double`
|
||||
-}
|
||||
argFractional :: Fractional n => ArgName -> Optional HelpMessage -> Parser n
|
||||
argFractional argName helpMessage =
|
||||
fmap fromRational (argRead argName helpMessage)
|
||||
|
||||
argParseToReadM :: (Text -> Maybe a) -> Opts.ReadM a
|
||||
argParseToReadM f = do
|
||||
s <- Opts.readerAsk
|
||||
|
|
Loading…
Reference in a new issue