OptionParserのソースコードを読む
この記事はElixir (その2)とPhoenix Advent Calendar 2016 の19日目の記事です。
背景 書籍「プログラミングElixir」の13章でお世話になったOptionParserがとても便利そうだったので、中身の理解とElixirのソースコードに慣れる目的で、ソースコードを読んでみました。 メインであるparse/2を中心に説明します。
下記に記載するソースコードは全て、公式のものを引用しています。
環境 Elixir 1.3.3
ドキュメント
ソースコード
おおまかな流れ parse/2 (外部に公開するインターフェース) do_parse/6 (実際にパースの再帰処理を行っているところ) next/4 (パース処理) ソースコード parse/2 まずはメインのparse/2です。
parse/2 @spec parse(argv, options) :: {parsed, argv, errors} def parse(argv, opts \\ []) when is_list(argv) and is_list(opts) do do_parse(argv, compile_config(opts), [], [], [], true) end 引数のoptsをcomple_config/1を通して加工してdo_parseに渡しています。 また、do_parse/6の結果をそのまま返しています。
compile_config/1 defp compile_config(opts) do aliases = opts[:aliases] || [] {switches, strict} = cond do opts[:switches] && opts[:strict] -> raise ArgumentError, ":switches and :strict cannot be given together" s = opts[:switches] -> {s, false} s = opts[:strict] -> {s, true} true -> {[], false} jend {aliases, switches, strict} end 設定には、:aliases, :switches, :strictが使用できそうです。 そして、:switchesと:strictが同時には使用できないみたいです。 それぞれの設定がどのように動作するかは後ほど。