package Reporter::Validator; # called as $app->model->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 => constraint_method_for('lab_num'), }, 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 constraint_method_for { my $profile_name = shift; my $methods = { lab_num => sub { my $dfv = shift; # ddp $dfv; $dfv->name_this('lab_num'); # to allow custom msg my $data = $dfv->get_filtered_data; # ddp $data; $data->{lab_number} =~ qr{\d+/\d{2}}; }, }; return $methods->{$profile_name}; } #------------------------------------------------------------------------------- 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;