Skip to content

Constraint validator::custom::htmlform

Yuki Kimoto edited this page May 19, 2015 · 5 revisions

Constraints of deprecated Validator::Custom::HTMLForm

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];
},

email

Check with Email::Valid.

my $data = {mail => 'a@somehost.com'};
my $rule = $vc->create_rule;
$rule->require('mail')->check('email');

email_mx

check with Email::Valid, including mx check.

my $data = {mail => 'a@somehost.com'};
my $rule = $vc->create_rule;
$rule->require('mail')->check('email_mx');

email_loose

check with Email::Valid::Loose.

my $data = {mail => 'a.@somehost.com'};
my $rule = $vc->create_rule;
$rule->require('mail')->check('email_loose');

email_loose_mx

my $data = {mail => 'a.@somehost.com'};
my $rule = $vc->create_rule;
$rule->require('mail')->check('email_loose');

date

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

time

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');

datetime

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

datetime_strptime

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

datetime_format

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'});