RSS Git Download  Clone
Raw Blame History
package Reporter::Validator;
 
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;