haskell - ¿Cómo analizar una bandera opcional como un valor de Maybe?
command-line-arguments applicative (1)
Vea el siguiente pasaje del README optparse-applicative
:
Los analizadores son instancias tanto de
Applicative
como deAlternative
, y funcionan con cualquier combinador genérico, comomany
ysome
. Por ejemplo, para hacer que una opción devuelvaNothing
lugar de fallar cuando no se suministra, puede usar el combinadoroptional
enControl.Applicative
:
optional $ strOption ( long "output" <> metavar "DIRECTORY" )
En consecuencia, todo lo que tiene que hacer es aplicar el combinador optional
al resultado de strOption
:
import Options.Applicative
data Config = Config
{ cIn :: Maybe String
, cOut :: Maybe String
} deriving Show
configParser :: Parser Config
configParser = Config
<$> (optional $ strOption $ long "in" <> short ''i'')
<*> (optional $ strOption $ long "out" <> short ''o'')
main :: IO ()
main = do
conf <- execParser (info configParser fullDesc)
print conf
Pruebas en la línea de comando:
$ main --in foo -o bar
Config {cIn = Just "foo", cOut = Just "bar"}
$ main -i foo
Config {cIn = Just "foo", cOut = Nothing}
Estoy tratando de usar optparse-applicative para analizar un Maybe String
pero no puedo encontrar en ningún lugar cómo tratar con Maybe
. Lo único que encontré es agregar un valor predeterminado, pero realmente necesito un Nothing
si el usuario no proporcionó una opción en lugar de ""
. ¿Hay alguna manera de lograr esto?
Aquí hay un ejemplo de código de trabajo:
import Options.Applicative
data Config = Config
{ cIn :: String
, cOut :: String
} deriving Show
configParser :: Parser Config
configParser = Config
<$> strOption (long "in" <> short ''i'')
<*> strOption (long "out" <> short ''o'')
main :: IO ()
main = do
conf <- execParser (info configParser fullDesc)
print conf
Sin embargo, me gustaría que los parámetros fueran opcionales y usar Maybe String
lugar de String
en Config
:
data Config = Config
{ cIn :: Maybe String
, cOut :: Maybe String
} deriving Show