2013/07/21

Docopt と相性のいい(はずの) CLI ディスパッチャ書いてみた

Docopt 便利すぎてたまらんのですが、例えば git みたいなサブコマンドでいろいろな処理をするようなコマンドラインツールを書こうと思ったときに、よしなにディスパッチしてくれるモジュールがあったらいいなと思ったので書いてみました。

CLI::Dispatch::Docopt

https://github.com/bayashi/CLI-Dispatch-Docopt

使い方

例えば、my_command というコマンドラインツールの中身が以下のようだとします。

use Docopt;
use CLI::Dispatch::Docopt;

my $opt = docopt(argv => \@ARGV);
run('MyApp::CLI' => $opt);

__END__

=head1 NAME

my_command

=head1 SYNOPSIS

    my_command <sub_command> [--foo]

=cut

run 関数は CLI::Dispatch::Docopt がエクスポートしたものです。

Docopt で <sub_command> を受け取ります。

そして、ディスパッチ先のモジュールを MyApp::CLI::Qux として用意しておきます。

package MyApp::CLI::Qux;
use Data::Dumper;

sub run {
    my ($self, $opt) = @_;

    warn __PACKAGE__. " run!\n". Dumper($opt);
}

1;

んでもって、コマンドラインで my_command を以下のように叩くと、実行されます。

$ my_command qux --foo

MyApp::CLI::Qux run!
$VAR1 = {
          '<sub_command>' => 'qux',
          '--foo' => bless( do{\(my $o = '1')}, 'boolean' )
        };

qux というサブコマンドが、MyApp::CLI::Qux にディスパッチされたわけですね。

まあ本当にこれだけしか仕事しないモジュールです。

どうすかね。

サイト内検索