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

ゆーすけべー日記

はてなBlogってどーなの!?

Data::Validator::Simple ってのを作り出した

Perl

親父と一緒にやってるBPMに変わる新しいアプリケーション「Kailas」の開発で、 必要になったので Data::Validator::Simple っていうちっちゃいモジュールを作り出しました。 アプリの要求として、「条件分岐」させなくてはいけないところがあって、 その判定に使うってのが作ることになった主な目的です。 条件分岐というと if else 使いますが、それを抽象化して、 特定のルール、例えばその値が範囲内にあるかどうかという「BETWEEN」や、 文字列や数値が一緒かという「EQUAL_TO」などをパラメータと共に渡せば結果が返ってくるという具合です。

というといわゆるFormValidator::*を思い浮かべますし、 実際のところそれを使ってもよかったのですが、 今回特殊なパターンがでてくることを想定したり、 基本的にWebのFormから受け取るようなデータは扱わないつもりなので、 作ってみました。

とはいってもFormValidatorっぽい動きもしたいよねーとも思ったりしたので、 Data::Validator::Simple::Formオブジェクトがその役目を(ある程度)担うようにもできてます。 実践に使ってないのでなんとも言えませんが、その辺りは改良できればします。

まだdeveloper release扱いなので、APIが変わるかもしれませんが、 以下現状のSYNOPSISを解説。

まずは単一なデータの検証。

use Data::Validator::Simple;

my $data = Data::Validator::Simple->new( data => 5 );
my $result = $data->check( ['BETWEEN', 4, 10 ] );
if( $result ){
  print "valid";
}else{
  print "error";
}

複雑なパターン。checkメソッドに配列で渡せば順番で評価。 渡す値がハッシュリファレンスでかつ評価が成功した場合、その中のsuccessを返します。 successの中身は何でもいいので、この辺りがKailasで生きてくるはずです。

my $data = Data::Validator::Simple->new( data => 5 );
my $result = $data->check(
    {
        rule    => [ 'EQUAL_TO', 6 ],
        success => 'fist_message',
    },
    {
        rule    => [ 'EQUAL_TO', 5 ],
        success => 'second_message',
    }
);
print $result; # second_message

最後に、FormValidator的に使う方法。

my $q = CGI->new;
$q->param( id   => 'login_id' );
$q->param( name => 'user_name' );
my %params = $q->Vars;

my $form = Data::Validator::Simple->form;
my $results = $form->check(
    \%params,
    {
        id => [ 'ASCII', [ 'LENGTH', 4, 10 ] ],
        name => [ 'LENGTH', 4, 20  ]
    }
);
if( $results->{id} && $results->{name} ){
  print "valid";
}

今のところValidateに使えるルールが少ないので、これは増やしていくと共に、 Web特有のそれ以外のケースにも対応したいです。 で、まぁかなーりFormValidator::Simpleを参考にしているので、 それでいいんじゃねーか!みたいなことはおいといて、 更なる発展を自分で祈って作っていきます。

0.01_01というバージョンでshipitしちゃったんで! そのうちsearch.cpan.orgにインデックスされると思います。