stackのコードを読んでるのでメモ。まだ全然肝心なところに入ってない。
- パーサーでコマンドライン引数をパースして、パースの結果として得られる関数を実行する作り
- optparse-applicativeをフォークして使っている
- なんの処理を加えてるのかは読んでない
- 例えばbuildだと、実際に走る処理は
buildCmd
となる - 例えば buildCmd だと、コマンドのオプションをパースした結果
BuildOptsCLI
を元にパース結果としてGlobalOpts -> IO ()
型の処理を生成して返す (run
に束縛される) GlobalOpts
のパース結果は addCommand によって作られ、run
という名前で束縛された実際の処理の引数として使われるbuild
コマンドの本命は Stack.Build.build- 設定は Config.hs にて継承関係で定義されている
- 継承関係と言ってるのは、フィールドを用意して明示的に親のデータを持っているという意味
Config
>BuildConfigNoLocal
>BuildConfig
BuildConfigNoLocal
>EnvConfigNoLocal
>EnvConfig
Config
>LoadConfig
- 例えばここに書いたデータ型はすべて
HasConfig
のインスタンスで、configL
というレンズを通してConfig
のデータに読み書きできる - DefaultSignatures拡張による
default
キーワードを使っている(この拡張、知らなかった)