package Mojolicious::Plugin::Vparam::Filters; use Mojo::Base -strict; use Mojolicious::Plugin::Vparam::Common qw(load_class); use List::MoreUtils qw(any); sub like($$) { return 'Value not defined' unless defined $_[0]; return 'Wrong format' unless $_[0] =~ $_[1]; return 0; } sub in($$) { my ($str, $list) = @_; die 'Not ArrayRef' unless 'ARRAY' eq ref $list; return 'Value not defined' unless defined $str; return 'Wrong value' unless any {defined($_) && $str eq $_} @$list; return 0; } sub size($$$) { my ($value, $min, $max) = @_; return 'Value is not defined' unless defined $value; return 'Value is not set' unless length $value; return sprintf "Value should not be less than %s", $min unless $min <= length $value; return sprintf "Value should not be longer than %s", $max unless $max >= length $value; return 0; } sub num_ge($$) { my $e = load_class('Mojolicious::Plugin::Vparam::Numbers'); die $e if $e; my $numeric = Mojolicious::Plugin::Vparam::Numbers::check_numeric( $_[0] ); return $numeric if $numeric; return sprintf "Value should not be greater than %s", $_[1] unless $_[0] >= $_[1]; return 0; } sub num_le($$) { my $e = load_class('Mojolicious::Plugin::Vparam::Numbers'); die $e if $e; my $numeric = Mojolicious::Plugin::Vparam::Numbers::check_numeric( $_[0] ); return $numeric if $numeric; return sprintf "Value should not be less than %s", $_[1] unless $_[0] <= $_[1]; return 0; } sub num_eq($$) { my $e = load_class('Mojolicious::Plugin::Vparam::Numbers'); die $e if $e; my $numeric = Mojolicious::Plugin::Vparam::Numbers::check_numeric( $_[0] ); return $numeric if $numeric; return sprintf "Value not equal" unless $_[0] == $_[1]; return 0; } sub num_ne($$) { my $e = load_class('Mojolicious::Plugin::Vparam::Numbers'); die $e if $e; my $numeric = Mojolicious::Plugin::Vparam::Numbers::check_numeric( $_[0] ); return $numeric if $numeric; return sprintf "Value equal" unless $_[0] != $_[1]; return 0; } sub num_range($$$) { my $min = num_ge $_[0] => $_[1]; return $min if $min; my $max = num_le $_[0] => $_[2]; return $max if $max; return 0; } sub str_lt($$) { return 'Value is not defined' unless defined $_[0]; return sprintf "Value should not be less than %s", $_[1] unless $_[0] lt $_[1]; return 0; } sub str_gt($$) { return 'Value is not defined' unless defined $_[0]; return sprintf "Value should not be greater than %s", $_[1] unless $_[0] gt $_[1]; return 0; } sub str_le($$) { return 'Value is not defined' unless defined $_[0]; return sprintf "Value should not be less or equal than %s", $_[1] unless $_[0] le $_[1]; return 0; } sub str_ge($$) { return 'Value is not defined' unless defined $_[0]; return sprintf "Value should not be greater or equal than %s", $_[1] unless $_[0] ge $_[1]; return 0; } sub str_cmp($$) { return 'Value is not defined' unless defined $_[0]; return sprintf "Value not equal" if $_[0] cmp $_[1]; return 0; } sub str_eq($$) { return 'Value is not defined' unless defined $_[0]; return sprintf "Value not equal" unless $_[0] eq $_[1]; return 0; } sub str_ne($$) { return 'Value is not defined' unless defined $_[0]; return sprintf "Value equal" unless $_[0] ne $_[1]; return 0; } sub register { my ($class, $self, $app, $conf) = @_; $app->vfilter(regexp => sub { like $_[1], $_[2] } ); $app->vfilter(in => sub { in $_[1], $_[2] } ); $app->vfilter(size => sub { size $_[1], $_[2][0], $_[2][1] } ); $app->vfilter(min => sub { num_ge $_[1], $_[2] } ); $app->vfilter(max => sub { num_le $_[1], $_[2] } ); $app->vfilter(equal => sub { num_eq $_[1], $_[2] } ); $app->vfilter('not' => sub { num_ne $_[1], $_[2] } ); $app->vfilter(range => sub { num_range $_[1], $_[2][0], $_[2][1] } ); $app->vfilter('lt' => sub { str_lt $_[1], $_[2] } ); $app->vfilter('gt' => sub { str_gt $_[1], $_[2] } ); $app->vfilter('le' => sub { str_le $_[1], $_[2] } ); $app->vfilter('ge' => sub { str_ge $_[1], $_[2] } ); $app->vfilter('cmp' => sub { str_cmp $_[1], $_[2] } ); $app->vfilter('eq' => sub { str_eq $_[1], $_[2] } ); $app->vfilter('ne' => sub { str_ne $_[1], $_[2] } ); return; } 1;