2017-02-22 5 views
1

私はフラグを使用してこれらのsubargumentsを解析したいOption.Applicative:結合されたパーサーをフラグで解析する方法は?

data Arguments = Arguments Bool (Maybe SubArguments) 
data SubArguments = SubArguments String String 

として、コマンドラインオプションを複雑いる:

programName --someflag --subarguments "a" "b" 
programName --someflag 

は私が既に持っている私が書く必要が何

subArgParser = SubArguments <$> argument str <*> argument str 
mainParser = MainArgs <$> switch 
        (long "someflag" 
        <> help "Some argument flag") 
       <*> ??? 
        (long "subarguments" 
        <> help "Sub arguments" 

the ???

答えて

1

少なくともそれは可能ではありません。間接的なエンコーディングがあるかもしれませんが、わかりません。オプションは引数を取るものであり、サブパーザではない。サブパーザーを使用することはできますが、オプションではなく(つまり、先頭に--がない)「コマンド」によって導入されます。

2

あなたの質問は、あなたが考えるよりも複雑であることが判明しました。現時点ではoptparse-applicative APIはこのようなケースでは使用されていません。したがって、おそらく、CLIの引数を扱う方法を変更したり、別のCLI解析ライブラリに切り替えることができます。しかし、私はあなたの目標を達成する最も近い方法を説明します。あなたがoptional機能を使用して、オプションの引数を解析する方法を知っている

1.How to parse Maybe with optparse-applicative

2.Is it possible to have a optparse-applicative option with several parameters?

最初の質問者:

まず、あなたは、他の2つのSOの質問を読んでする必要があります。秒から、複数の引数を解析する際のいくつかの問題を学びます。この問題を回避するには、いくつかのアプローチをここに書きます。

1.ナイーブと醜い

あなたはStringタイプのペアとして文字列のペアを表し、このペアのちょうどナイーブshowを使用することができます。 ghci

ここ
mainParser :: Parser Arguments 
mainParser = Arguments 
    <$> switch (long "someflag" <> help "Some argument flag") 
    <*> optional (uncurry SubArguments <$> 
        (option auto $ long "subarguments" <> help "some desc")) 

getArguments :: IO Arguments 
getArguments = do 
    (res,()) <- simpleOptions "main example" "" "desc" mainParser empty 
    return res 

main :: IO() 
main = getArguments >>= print 

結果である:ここでは、コードです

ghci> :run main --someflag --subarguments "(\"a\",\"b\")" 
Arguments True (Just (SubArguments "a" "b")) 

2.あまりあなたが1つの文字列内で複数の引数を渡す方法を学ぶ必要がある2番目の質問への答えから

ナイーブ。ここでは、解析のためのコードは次のとおりです。

subArgParser :: ReadM SubArguments 
subArgParser = do 
    input <- str 
    -- no error checking, don't actually do this 
    let [a,b] = words input 
    pure $ SubArguments a b 

mainParser :: Parser Arguments 
mainParser = Arguments 
    <$> switch (long "someflag" <> help "Some argument flag") 
    <*> optional (option subArgParser $ long "subarguments" <> help "some desc") 

そして、ここではghci出力されます。

ghci> :run main --someflag --subarguments "x yyy" 
Arguments True (Just (SubArguments "x" "yyy")) 

第二の溶液中唯一の悪い点は、エラーチェックが存在しないということです。したがって、let [a,b] = words inputではなく、別の汎用構文解析ライブラリ、たとえばmegaparsecを使用することができます。

+0

私は図書館の著者に尋ねました。それは不可能です(今のところ)。パオロ・カピリオッティによるアンヴェールを見る – Pieter

関連する問題