Constraint validator::custom::htmlform
Yuki Kimoto edited this page May 19, 2015
·
5 revisions
email => sub {
require Email::Valid;
return 0 unless $_[0];
return Email::Valid->address(-address => $_[0]) ? 1 : 0;
},
email_mx => sub {
require Email::Valid;
return 0 unless $_[0];
return Email::Valid->address(-address => $_[0], -mxcheck => 1) ? 1 : 0;
},
email_loose => sub {
require Email::Valid::Loose;
return 0 unless $_[0];
return Email::Valid::Loose->address($_[0]) ? 1 : 0;
},
email_loose_mx => sub {
require Email::Valid::Loose;
return 0 unless $_[0];
return Email::Valid::Loose->address(-address => $_[0], -mxcheck => 1) ? 1 : 0;
},
date => sub {
my ($values, $options) = @_;
my ($year, $month, $day) = @$values;
$options ||= {};
require Date::Calc;
my $is_valid = Date::Calc::check_date($year, $month, $day) ? 1 : 0;
my $value;
if ($is_valid) {
my $class = $options->{datetime_class} || '';
if ($class eq 'DateTime') {
require DateTime;
my %date = (
year => $year,
month => $month,
day => $day,
);
if ($options->{time_zone}) {
$date{time_zone} = $options->{time_zone};
}
$value = $class->new(%date);
}
elsif ($class eq 'Time::Piece') {
require Time::Piece;
$value = sprintf "%04d-%02d-%02d 00:00:00", $year, $month, $day;
$value = $class->strptime($value, "%Y-%m-%d %H:%M:%S");
}
else {
$value = sprintf "%04d-%02d-%02d 00:00:00", $year, $month, $day;
}
}
return [$is_valid, $value];
},
time => sub {
my ($hour, $min, $sec) = @{$_[0]};
$hour ||= 0;
$min ||= 0;
$sec ||= 0;
require Date::Calc;
my $value = Date::Calc::check_time($hour, $min, $sec) ? 1 : 0;
my $time = $value ? sprintf("%02d:%02d:%02d", $hour, $min, $sec) : undef;
return [$value, $time];
},
datetime => sub {
my ($values, $options) = @_;
my ($year, $month, $day, $hour, $min, $sec) = @$values;
$options ||= {};
$hour ||= 0;
$min ||= 0;
$sec ||= 0;
my $is_valid = Date::Calc::check_date($year, $month, $day)
&& Date::Calc::check_time($hour, $min, $sec) ? 1 : 0;
my $data;
if ($is_valid) {
my $class = $options->{datetime_class} || '';
if ($class eq 'DateTime') {
require DateTime;
my %date = (
year => $year,
month => $month,
day => $day,
hour => $hour,
minute => $min,
second => $sec,
);
if ($options->{time_zone}) {
$date{time_zone} = $options->{time_zone};
}
$data = $class->new(%date);
}
elsif ($class eq 'Time::Piece') {
require Time::Piece;
$data = sprintf "%04d-%02d-%02d %02d:%02d:%02d",
$year, $month, $day, $hour, $min, $sec;
$data = $class->strptime($data, "%Y-%m-%d %H:%M:%S");
}
else {
$data = sprintf "%04d-%02d-%02d %02d:%02d:%02d",
$year, $month, $day, $hour, $min, $sec;
}
}
return [$is_valid, $data];
},
datetime_format => sub {
my ($date, $arg) = @_;
my $format;
my $options;
if (ref $arg eq 'ARRAY') {
($format, $options) = @$arg;
}
else {
$format = $arg;
}
$options ||= {};
croak "Constraint 'datetime_format' needs a format argument"
unless $format;
my $module;
if ( ref $format ) {
$module = $format;
}
else {
$module = "DateTime::Format::$format";
eval "require $module";
croak "Constraint 'datetime_format': failed to require $module. $@"
if $@;
}
my $dt;
eval {
$dt = $module->parse_datetime($date);
};
my $is_valid = $dt ? 1 : 0;
if ( $dt && $options->{time_zone} ) {
$dt->set_time_zone( $options->{time_zone} );
}
return [$is_valid, $dt];
},
datetime_strptime => sub {
my ($date, $arg) = @_;
my $format;
my $options;
if (ref $arg eq 'ARRAY') {
($format, $options) = @$arg;
}
else {
$format = $arg;
}
$options ||= {};
croak "Constraint 'datetime_strptime' needs a format argument"
unless $format;
my $dt;
require DateTime::Format::Strptime;
eval{
my $strp = DateTime::Format::Strptime->new(
pattern => $format,
on_error => 'croak'
);
$dt = $strp->parse_datetime($date);
};
my $is_valid = $dt ? 1 : 0;
if ( $dt && $options->{time_zone} ) {
$dt->set_time_zone( $options->{time_zone} );
}
return [$is_valid, $dt];
},
Check with Email::Valid.
my $data = {mail => 'a@somehost.com'};
my $rule = $vc->create_rule;
$rule->require('mail')->check('email');
check with Email::Valid, including mx check.
my $data = {mail => 'a@somehost.com'};
my $rule = $vc->create_rule;
$rule->require('mail')->check('email_mx');
check with Email::Valid::Loose.
my $data = {mail => 'a.@somehost.com'};
my $rule = $vc->create_rule;
$rule->require('mail')->check('email_loose');
my $data = {mail => 'a.@somehost.com'};
my $rule = $vc->create_rule;
$rule->require('mail')->check('email_loose');
check with Date::Calc
my $data = {year => '2009', month => '12', day => '13'};
my $rule = $vc->create_rule;
$rule->require([qw/year month day/])->name('date')->check('date');
my $vresult = $vc->validate($data, $rule);
$vresult->data->{date}; # 2009-12-13 00:00:00
You can specify options
# Convert DateTime object
my $rule = $vc->create_rule;
$rule->require([qw/year month day/])->name('date')
->check({'date' => {'datetime_class' => 'DateTime', time_zone => 'Asia/Tokyo'}})
my $vresult = $vc->validate($data, $rule);
$vresult->data->{date}; # DateTime object
# Convert Time::Piece object
my $rule = $vc->create_rule;
$rule->require([qw/year month day/])->name('date')
->check({'date' => {'datetime_class' => 'Time::Piece'});
my $vresult = $vc->validate($data, $rule);
$vresult->data->{date}; # Time::Piece object
check with Date::Calc
my $data = {hour => '12', minute => '40', second => '13'};
my $rule = $vc->create_rule;
$rule->require([qw/hour minute second/])->check('time');
check with Date::Calc
my $data = {
year => '2009', month => '12', day => '13'
hour => '12', minute => '40', second => '13'
};
my $rule = $vc->create_rule;
$rule->require([qw/year month day hour minute second/])->name('datetime')
->check('datetime');
my $vresult = $vc->validate($data, $rule);
$vresult->data->{datetime}; # 2009-12-13 12:40:13
You can specify options
# Convert DateTime object
my $rule = $vc->create_rule;
$rule->require([qw/year month day hour minute second/])->name('datetime')
->check({'datetime' => {'datetime_class' => 'DateTime', time_zone => 'Asia/Tokyo'}});
my $vresult = $vc->validate($data, $rule);
$vresult->data->{date}; # DateTime object
# Convert Time::Piece object
my $rule = $vc->create_rule;
$rule->require([qw/year month day hour minute second/])->name('datetime')
->check({'datetime' => {'datetime_class' => 'Time::Piece'}});
my $vresult = $vc->validate($data, $rule);
$vresult->data->{date}; # Time::Piece object
check with DateTime::Format::Strptime.
my $data = {datetime => '2006-04-26T19:09:21+0900'};
my $rule = $vc->create_rule;
$rule->require('datetime')->check({'datetime_strptime' => '%Y-%m-%dT%T%z'});
my $vresult = $vc->validate($data, $rule);
$vresult->data->{datetime}; # DateTime object
check with DateTime::Format::***. for example, DateTime::Format::HTTP, DateTime::Format::Mail, DateTime::Format::MySQL and etc.
my $data = {datetime => '2004-04-26 19:09:21'};
my $rule = $vc->create_rule;
$rule->require('datetime')->check({datetime_format => 'MySQL'});