--- trunk/lib/WebPAC/Validate.pm 2006/05/16 13:38:09 514 +++ trunk/lib/WebPAC/Validate.pm 2006/05/16 15:23:05 515 @@ -7,6 +7,7 @@ use base 'WebPAC::Common'; use File::Slurp; +use List::Util qw/first/; use Data::Dumper; =head1 NAME @@ -79,10 +80,9 @@ my $fld = shift @d || $log->logdie("need field name in line $curr_line: $l"); if (@d) { - $v->{$fld}->{ref} = 'ARRAY'; - $v->{$fld}->{sf} = \@d; + $v->{$fld} = \@d; } else { - $v->{$fld}->{ref} = ''; + $v->{$fld} = 1; } } @@ -94,6 +94,70 @@ $self ? return $self : return undef; } +=head2 validate_errors + +Validate record and return errors + + my @errors = $validate->validate_errors( $rec ); + +=cut + +sub validate_errors { + my $self = shift; + + my $log = $self->_get_logger(); + + my $rec = shift || $log->logdie("validate_errors need record"); + + $log->logdie("rec isn't HASH") unless (ref($rec) eq 'HASH'); + $log->logdie("can't find validation rules") unless (my $r = $self->{rules}); + + my @errors; + + $log->debug("rec = ", sub { Dumper($rec) }, "keys = ", keys %{ $rec }); + + foreach my $f (keys %{ $rec }) { + + next if (!defined($f) || $f eq ''); + + if (! defined($r->{$f})) { + push @errors, "field '$f' shouldn't exists"; + next; + } + + if (ref($rec->{$f}) ne 'ARRAY') { + push @errors, "field '$f' isn't repetable, probably bug in parsing input data"; + next; + } + + foreach my $v (@{ $rec->{$f} }) { + # can we have subfields? + if (ref($r->{$f}) eq 'ARRAY') { + # are values hashes? (has subfields) + if (ref($v) ne 'HASH') { + push @errors, "$f has value without subfields: $v"; + next; + } else { + foreach my $sf (keys %{ $v }) { + # permited subfield? + if (! first { $_ eq $sf } @{ $r->{$f} }) { + push @errors, "$f has unknown subfield: $sf"; + } + } + } + } elsif (ref($v) eq 'HASH') { + push @errors, "$f has subfields which is not valid"; + } + } + } + + #$log->logcluck("return from this function is ARRAY") unless wantarray; + + $log->debug("errors: ", join(", ", @errors)) if (@errors); + + return @errors; +} + =head1 AUTHOR Dobrica Pavlinusic, C<< >>