2

Если у меня есть следующие типы и анализатор:Haskell optparse-аппликативны: разбор списка записей, которые имеют несколько полей

data Mode = 
    Mode1 
    | Mode2 
    deriving (Show, Eq, Read) 

data ThingINeedMulitpleOf = 
    Thing { _name :: String, _mode :: Mode } 
    deriving (Show, Eq) 

thingParser :: Parser ThingINeedMulitpleOf 
thingParser = Thing <$> strArgument (metavar "NAME") 
        <*> option auto (long "mode" <> metavar "MODE") 

и я построить анализатор следующим образом:

data Config = 
    Config ThingINeedMulitpleOf ThingINeedMulitpleOf 
    deriving (Show, Eq) 

loadConfig = execParser $ info (Config <$> thingParser <*> thingParser) fullDesc 

то я могу успешно разобрать my-exe Thing1 --mode Mode1 Thing2 --mode Mode2, но это полезно, только если я хочу ровно два Things. Я бегу в проблемы при попытке изменить Config для поддержки пThing с, то есть:

data Config = 
    Config [ThingINeedMulitpleOf] 
    deriving (Show, Eq) 

loadConfig = execParser $ info (Config <$> many thingParser) fullDesc 

, но я не могу теперь уже не разобрать my-exe Thing1 --mode Mode1 Thing2 --mode Mode2, что дает мне ошибку Invalid argument 'Thing1'

Интересно, это работает, если ThingINeedMulitpleOf содержит только одно поле.

ответ

3

Если вы используете подпараметр с Alternative typeclass's some, вы можете получить эффект, который вы ищете, правда, с немного отличающимся синтаксисом командной строки.

thingSubparser :: Parser ThingINeedMulitpleOf 
thingSubparser = subparser $ command "thing" (info thingParser mempty) 

loadConfig :: IO Config 
loadConfig = execParser $ info (Config <$> some thingSubparser) fullDesc 

При этом вы можете написать командные строки:

my-exe thing test --mode Mode1 thing test2 --mode Mode2 

, которые дают объект Config:

Config [Thing {_name = "test", _mode = Mode1},Thing {_name = "test2", _mode = Mode2}] 

Я не совсем уверен, почему вам нужно subparser и может» t просто используйте some против thingParser, но если бы мне пришлось угадать, это было бы потому, что команда дает синтаксическому анализатору разделитель (аргумент «вещь»/имя команды).

 Смежные вопросы

  • Нет связанных вопросов^_^