読者です 読者をやめる 読者になる 読者になる

Delphiでコマンドライン引数をパースするユニットを作ってみた

以前コマンドライン引数の取得について書いたとき、FindCmdLineSwitchという関数があることを教えてもらった。
Delphiでコマンドライン引数を取得する - 偏った言語信者の垂れ流し
System.SysUtils.FindCmdLineSwitch - XE3 API Documentation
試してみたのだけど、FindCmdLineSwitchだと、スイッチ部分以外のパラメータを取得したりできなかったり、"--foo=bar"みたいな形式の値指定ができなかったので、自作することにした。
tokibito / delphi-argparse — Bitbucket
使い方はこんな感じ。

var
  Parser: TArgumentParser;
  ParseResult: TParseResult;
begin
  Parser := TArgumentParser.Create;
  Parser.AddArgument('--foo', saBool);  // --fooという名前の値なしスイッチ
  Parser.AddArgument('--bar', saStore);  // --bar bar_value形式のスイッチ
  ParseResult := Parser.ParseArgs;  // パースする(TList<String>な引数を省略するとParamStrの内容が使われる
  ParseResult.HasArgument('foo');  // --fooが指定されてたらTrueが返される
  ParseResult.GetValue('bar');  // --barで指定された値が返される(String)
end;

ParseResultは取得したら自前で開放する必要がある。
おそらく名前空間の指定方法とかの関係でDelphiXE3でしか動かない。
Pythonのargparseと比べると貧弱すぎるけど、自分で使う分にはなんとか足りるかな。