App-Spec
view release on metacpan or search on metacpan
lib/App/Spec/Run/Validator.pm view on Meta::CPAN
integer => sub { $_[0] =~ m/^[+-]?\d+$/ },
float => sub { $_[0] =~ m/^[+-]?\d+(?:\.\d+)?$/ },
flag => sub { 1 },
enum => sub {
my ($value, $list) = @_;
any { $value eq $_ } @$list;
},
);
sub process {
my ($self, $run, $errs) = @_;
my ($ok) = $self->_process( $errs, type => "parameters", app => $run );
$ok &&= $self->_process( $errs, type => "options", app => $run );
return $ok;
}
sub _process {
my ($self, $errs, %args) = @_;
my $run = $args{app};
my $type = $args{type};
my ($items, $specs);
if ($args{type} eq "parameters") {
$items = $self->parameters;
$specs = $self->param_specs;
}
else {
$items = $self->options;
$specs = $self->option_specs;
}
# TODO: iterate over parameters in original cmdline order
for my $name (sort keys %$specs) {
my $spec = $specs->{ $name };
my $value = $items->{ $name };
my $param_type = $spec->type;
my $enum = $spec->enum;
if ($spec->type eq "flag") {
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;
}
( run in 2.101 seconds using v1.01-cache-2.11-cpan-6aa56a78535 )