optparse-applicative
サンプルはこんな感じに実行する
$ stack exec -- hoge-exe --hello "hogepiyo" --enthusiasm 10
例
書き換えようmrsekut.icon
code:hs
module CLI ( cli ) where
import Options.Applicative
-- Parserに渡す型を定義する
data CLI = CLI { ast :: Bool
, compile :: FilePath
}
-- Builderを組み合わせる
config :: Parser CLI
config =
CLI
<$> switch
( long "ast"
<> short 'a'
<> help "Target for the greeting" )
<*> strOption
( long "compile"
<> short 'c'
<> metavar "FILENAME"
<> help "Input file" )
-- コマンドオプションの設定
cliOption :: CLI -> IO ()
cliOption (CLI True _) = astRepl
cliOption (CLI False s) = compileFile s
cliOption (CLI False _) = evalRepl
-- 実行関数
cli :: IO ()
cli = cliOption =<< execParser opts
where opts = info (config <**> helper)
( fullDesc
<> progDesc "Hytl REPL")
Parserに渡す型を定義する
code:hs
data Sample = Sample
{ hello :: String
, quiet :: Bool
, enthusiasm :: Int }
これらのレコードの一項目が一つのオプションになる
上の例では3種類のオプションと、それに加えてhelpが用意されたCLIを作る感じになる
ヘルプに表示される順番と一致する
Builder
いっぱいある
switch
フラグを定義できる
フラグがあるときはTrue、そうでないときはFalse
引数はなし
strOption
何かしらの-oのようなオプションを取る
引数として与えられた文字列をそのまま得る
引数は必須
optional
引数は省略可能
option auto
引数を文字列から別の型に変えて得ることができる
いつ使うんだこれmrsekut.icon
argument auto
auto :: Read a => ReadM a
引数何もなしは?
Builderのサブコマンド
これらはモノイド
longがコマンドラインのoption名
上の例なら--compileで指定する
shortはそれの一文字版 -c
valueはデフォルト値
metavarとは
ヘルプ中のメタ変数
help
helpオプション時に表示する文言
補完をする
completer
action
これを使うといい
サブコマンドを作る
$ gitの$ git addや$ git commitのようにサブコマンドを作ることができる
--hogeのようなoptional引数ではなく
ParserInfo
Parserにヘルプの表示方法などのカスタム情報を付与する
参考