sto usando optparse-applicative
e vorrei poter analizzare la linea di comando quali:opzione optparse-applicativa con più valori
$ ./program -a file1 file2 -b filea fileb
Per esempio, due interruttori, entrambi i quali possono richiedere più argomenti .
Così ho un tipo di dati per le mie opzioni che assomiglia a questo:
data MyOptions = MyOptions {
aFiles :: [String]
, bFiles :: [String] }
E poi un Parser
come questo:
config :: Parser MyOptions
config = MyOptions
<$> option (str >>= parseStringList)
(short 'a' <> long "aFiles")
<*> option (str >>= parseStringList)
(short 'b' <> long "bFiles")
parseStringList :: Monad m => String -> m [String]
parseStringList = return . words
Questo approccio non riesce a che darà il risultato previsto quando viene fornito un solo argomento per ogni switch, ma se si fornisce un secondo argomento si ottiene "Argomento non valido" per quel secondo argomento.
Mi chiedevo se potevo escluderlo fingendo di volere quattro opzioni: un interruttore booleano (ad esempio -a
); una lista di stringhe; un altro interruttore booleano (ad esempio -b
); e un altro elenco di stringhe. Così ho cambiato il mio tipo di dati:
data MyOptions = MyOptions {
isA :: Bool
, aFiles :: [String]
, isB :: Bool
, bFiles :: [String] }
e poi modificato il parser in questo modo:
config :: Parser MyOptions
config = MyOptions
<$> switch
(short 'a' <> long "aFiles")
<*> many (argument str (metavar "FILE"))
<*> switch
(short 'b' <> long "bFiles")
<*> many (argument str (metavar "FILE"))
questa volta usando il many
e argument
combinatori invece di un parser esplicita per un elenco di stringhe.
Ma ora il primo many (argument str (metavar "FILE"))
consuma tutte degli argomenti, compresi quelli che seguono l'interruttore -b
.
Quindi, come posso scrivere questo parser degli argomenti?
gli argomenti liberi non sarebbero ambigui se gli argomenti di '-a' fossero vincolati a non iniziare con' -', però. – rampion