package Reporter::Validator; # called as $app->validator->validate( => $params ); use Data::FormValidator; use Data::FormValidator::Constraints qw(:closures); use Reporter::Class; has dfv => ( is => 'lazy', builder => sub { Data::FormValidator->new( {}, _dfv_defaults() ) }, ); has profiles => ( is => 'ro', isa => HashReference, builder => 1, ); sub _build_profiles { # hashref of dfv profiles { search => { required => 'lab_number', constraint_methods => { lab_number => sub { my ($dfv, $param) = @_; # ddp $dfv; $dfv->name_this('lab_num'); # to allow custom msg $param =~ qr{\d+/\d{2}}; }, }, msgs => { constraints => { lab_num => 'lab number format incorrect: require nnn/yy', }, }, }, report => { required => [ qw( status specimen_quality diagnosis_id ) ], optional => [ qw( request_notes clinical_details secondary_diagnosis_id morphology comment ) ], dependencies => { _require_biopsy_details => 'biopsy_site', _require_gross_description => 'gross_description', }, constraint_methods => { }, msgs => { constraints => { }, }, }, } } sub validate { my ($self, $profile_name, $params) = @_; # p $profile_name; p $params; my $profile = $self->profiles->{$profile_name}; # ddp $profile; my $result = $self->dfv->check($params, $profile); # ddp $result; my %h = ( dfv_errs => $result->msgs, # empty hashref if success valid => $result->valid || {}, # undef if failed success => $result->success || 0, # empty if failed failed => ! $result->success || 0, # empty if failed ); # ddp %h; return \%h; } sub _dfv_defaults { return { missing_optional_valid => 1, filters => 'trim', # trims white space either side of field param msgs => { # any_errors => 'dfv_errors', # not needed format => '%s', # style goes in .tt not here !! }, }; } 1;