Updated options module

Changed arg/opt parsing to return monomorphic values and made short name
argument mandatory
This commit is contained in:
Gabriel Gonzalez 2015-07-04 09:30:19 -07:00
parent c1a97ca50e
commit c8d3ebed38

View file

@ -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