だるろぐ

だるいぶろぐです

FormValidator::Lite でBETWEEN

FormValidator::SimpleにはBETWEENというルールがある。やる事はそのまんま、値が範囲内に収まっているかを見る。
でFormValidator::Liteでもこれをやりたく。

package FormValidator::Lite::Constraint::Between;
use FormValidator::Lite::Constraint;

rule 'BETWEEN' => sub {
    my $data = shift;

    my ($size, $min, $max) = ($data->[0], $data->[1], $data->[2]);

    unless (defined($size) && $size =~ /^\d+$/ && defined($min) && $min =~ /^\d+$/ && defined($max) && $max =~ /^\d+$/) {
        die 'invalid args.';
    }

    ($min <= $size && $size <= $max) ? 1 : 0;
};

1;

試す。

use strict;
use warnings;
use lib "lib";
sub say {print @_, "\n"}
use FormValidator::Lite qw/Between/;
use CGI;

for my $in (0..6) {
    say "$in でテスト";

    my $q = CGI->new;
    $q->param(in => $in);

    my $v = FormValidator::Lite->new($q);
    $v->set_message_data({
        param => {
            in => "セルフサービスで入れたin",
        },
        function => {
            between => "[_1] でbetweenがerror",
        },
        message => {},
    });

    my $res = $v->check(
        in => [[BETWEEN => [$q->param('in'), 2, 5]]],
    );

    if ($res->has_error) {
        for my $m ($v->get_error_messages) {
            say "  $m";
        }
    }
}

んで実行。

% perl main.pl
0 でテスト
1 でテスト
  セルフサービスで入れたin でbetweenがerror
2 でテスト
3 でテスト
4 でテスト
5 でテスト
6 でテスト
  セルフサービスで入れたin でbetweenがerror

何か0がスルーされるなと思ってcheckメソッド見たら

                if ((not $_) && $rule_name ne 'NOT_NULL') {
                    1;
                } else {

となってたので

                if ((not defined $_) && $rule_name ne 'NOT_NULL') {
                    1;
                } else {

としたらBETWEENも既存のも行けたのでこれでいいや。多分ニーズは無い。
あと同じようにDBの値を見る FormValidator::Simple::Plugin::DBIC::Unique みたいなのもさくっと書いた。

追記

ちゃんと書いた版
http://d.hatena.ne.jp/hirafoo/20100605/1275666500