use Params::Validate qw(:all); use Test::More; plan tests => 4; sub howareyoufeelingtoday { validate_pos( @_, { callback => { 'valids' => sub { shift =~ qr/^(happy|sad|mental)$/ } } } ); return 1; } ok(howareyoufeelingtoday(q{happy}), q{happy}); ok(howareyoufeelingtoday(q{sad}), q{sad}); ok(howareyoufeelingtoday(q{mental}), q{mental}); ok(howareyoufeelingtoday(q{unhappy}), q{unhappy}); # Should not pass #### $ perl pv.pl 1..4 ok 1 - happy ok 2 - sad ok 3 - mental ok 4 - unhappy #### diff --git a/lib/Params/Validate.xs b/lib/Params/Validate.xs index 396a369..3f3f0f4 100644 --- a/lib/Params/Validate.xs +++ b/lib/Params/Validate.xs @@ -508,10 +508,12 @@ static IV validate_one_param(SV* value, SV* params, HV* spec, SV* id, HV* options, IV* untaint) { SV** temp; IV i; + IV found = 0; /* check type */ if ((temp = hv_fetch(spec, "type", 4, 0))) { IV type; + found = 1; if ( ! ( SvOK(*temp) && looks_like_number(*temp) @@ -557,6 +559,7 @@ validate_one_param(SV* value, SV* params, HV* spec, SV* id, HV* options, IV* unt /* check isa */ if ((temp = hv_fetch(spec, "isa", 3, 0))) { + found = 1; SvGETMAGIC(*temp); if (SvROK(*temp) && SvTYPE(SvRV(*temp)) == SVt_PVAV) { @@ -581,6 +584,7 @@ validate_one_param(SV* value, SV* params, HV* spec, SV* id, HV* options, IV* unt /* check can */ if ((temp = hv_fetch(spec, "can", 3, 0))) { + found = 1; SvGETMAGIC(*temp); if (SvROK(*temp) && SvTYPE(SvRV(*temp)) == SVt_PVAV) { AV* array = (AV*) SvRV(*temp); @@ -605,6 +609,7 @@ validate_one_param(SV* value, SV* params, HV* spec, SV* id, HV* options, IV* unt /* let callbacks to do their tests */ if ((temp = hv_fetch(spec, "callbacks", 9, 0))) { + found = 1; SvGETMAGIC(*temp); if (SvROK(*temp) && SvTYPE(SvRV(*temp)) == SVt_PVHV) { HE* he; @@ -681,6 +686,7 @@ validate_one_param(SV* value, SV* params, HV* spec, SV* id, HV* options, IV* unt IV has_regex = 0; IV ok; + found = 1; SvGETMAGIC(*temp); if (SvPOK(*temp)) { @@ -732,6 +738,15 @@ validate_one_param(SV* value, SV* params, HV* spec, SV* id, HV* options, IV* unt } } + /* Catch unknown options not in (callbacks,can,isa,regex,type) */ + if (!found) { + SV* buffer; + + buffer = sv_2mortal(newSVsv(id)); + sv_catpv(buffer, "unknown option error\n"); + FAIL(buffer, options); + } + if ((temp = hv_fetch(spec, "untaint", 7, 0))) { if (SvTRUE(*temp)) { *untaint = 1;