App-Spec

 view release on metacpan or  search on metacpan

lib/App/Spec/Run/Validator.pm  view on Meta::CPAN

            if ($spec->multiple) {
                if (defined $value and $value !~ m/^\d+$/) {
                    die "Value for '$name': '$value' shouldn't happen";
                }
            }
            else {
                if (defined $value and $value != 1) {
                    die "Value for '$name': '$value' shouldn't happen";
                }
            }
            next;
        }

        my $values;
        if ($spec->multiple and $spec->mapping) {
            if (not defined $value) {
                $items->{ $name } = $value = {};
            }
            $values = $value;

            if (not keys %$values) {
                if (defined (my $default = $spec->default)) {
                    $values = { split m/=/, $default, 2 };
                    $items->{ $name } = $values;
                }
            }

            if (not keys %$values and $spec->required) {
                $errs->{ $type }->{ $name } = "missing";
                next;
            }

            if (not keys %$values) {
                next;
            }

        }
        elsif ($spec->multiple) {
            if (not defined $value) {
                $items->{ $name } = $value = [];
            }
            $values = $value;

            if (not @$values) {
                if (defined (my $default = $spec->default)) {
                    $values = [ $default ];
                    $items->{ $name } = $values;
                }
            }

            if ( not @$values and $spec->required) {
                $errs->{ $type }->{ $name } = "missing";
                next;
            }

            if (not @$values) {
                next;
            }

            if ($spec->unique and (uniq @$values) != @$values) {
                $errs->{ $type }->{ $name } = "not_unique";
                next;
            }

        }
        else {

            if (not defined $value) {
                if (defined (my $default = $spec->default)) {
                    $value = $default;
                    $items->{ $name } = $value;
                }
            }

            if ( not defined $value and $spec->required) {
                $errs->{ $type }->{ $name } = "missing";
                next;
            }

            if (not defined $value) {
                next;
            }

            $values = [ $value ];
        }

        my $def;
        if (ref $param_type eq 'HASH') {
            ($param_type, $def) = %$param_type;
        }
        my $code = $validate{ $param_type }
            or die "Missing method for validation type $param_type";

        my $possible_values = $spec->mapping ? {} : [];
        if (my $spec_values = $spec->values) {
            if (my $op = $spec_values->{op}) {
                my $args = {
                    runmode => "validation",
                    parameter => $name,
                };
                $possible_values = $run->cmd->$op($run, $args) || [];
            }
            elsif ($spec->mapping) {
                $possible_values = $spec_values->{mapping};
            }
            else {
                $possible_values = $values->{enum};
            }
        }

        my @to_check = $spec->mapping
            ? map { [ $_ => $values->{ $_ } ] } keys %$values
            : @$values;
        for my $item (@to_check) {
            my ($key, $v);
            if ($spec->mapping) {
                ($key, $v) = @$item;
            }
            else {
                $v = $item;
            }



( run in 2.024 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )