Skip to content

Commit

Permalink
Add enum type
Browse files Browse the repository at this point in the history
  • Loading branch information
ilmari authored and Arthur Axel 'fREW' Schmidt committed Sep 22, 2012
1 parent 4e43db0 commit 4c3f67f
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 27 deletions.
17 changes: 7 additions & 10 deletions lib/SQL/Translator/Schema/Constraint.pm
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ use Moo 1.000003;
use SQL::Translator::Schema::Constants;
use SQL::Translator::Utils qw(ex2err throw);
use SQL::Translator::Role::ListAttr;
use SQL::Translator::Types qw(schema_obj);
use SQL::Translator::Types qw(schema_obj enum);
use Sub::Quote qw(quote_sub);

extends 'SQL::Translator::Schema::Object';
Expand Down Expand Up @@ -227,11 +227,9 @@ has match_type => (
is => 'rw',
default => quote_sub(q{ '' }),
coerce => quote_sub(q{ lc $_[0] }),
isa => sub {
my $arg = $_[0];
throw("Invalid match type: $arg")
if $arg && !($arg eq 'full' || $arg eq 'partial' || $arg eq 'simple');
},
isa => enum([qw(full partial simple)], {
msg => "Invalid match type: %s", allow_false => 1,
}),
);

around match_type => \&ex2err;
Expand Down Expand Up @@ -368,11 +366,10 @@ Get or set the constraint's type.
has type => (
is => 'rw',
default => quote_sub(q{ '' }),
isa => sub {
throw("Invalid constraint type: $_[0]")
if $_[0] && !$VALID_CONSTRAINT_TYPE{ $_[0] };
},
coerce => quote_sub(q{ (my $t = $_[0]) =~ s/_/ /g; uc $t }),
isa => enum([keys %VALID_CONSTRAINT_TYPE], {
msg => "Invalid constraint type: %s", allow_false => 1,
}),
);

around type => \&ex2err;
Expand Down
9 changes: 4 additions & 5 deletions lib/SQL/Translator/Schema/Index.pm
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ use Moo 1.000003;
use SQL::Translator::Schema::Constants;
use SQL::Translator::Utils qw(ex2err throw);
use SQL::Translator::Role::ListAttr;
use SQL::Translator::Types qw(schema_obj);
use SQL::Translator::Types qw(schema_obj enum);
use Sub::Quote qw(quote_sub);

extends 'SQL::Translator::Schema::Object';
Expand Down Expand Up @@ -147,12 +147,11 @@ uppercase.

has type => (
is => 'rw',
isa => sub {
my $type = uc $_[0] or return;
throw("Invalid index type: $type") unless $VALID_INDEX_TYPE{$type};
},
coerce => quote_sub(q{ uc $_[0] }),
default => quote_sub(q{ 'NORMAL' }),
isa => enum([keys %VALID_INDEX_TYPE], {
msg => "Invalid index type: %s", allow_false => 1,
}),
);

around type => \&ex2err;
Expand Down
18 changes: 8 additions & 10 deletions lib/SQL/Translator/Schema/Trigger.pm
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ C<SQL::Translator::Schema::Trigger> is the trigger object.

use Moo 1.000003;
use SQL::Translator::Utils qw(parse_list_arg ex2err throw);
use SQL::Translator::Types qw(schema_obj);
use SQL::Translator::Types qw(schema_obj enum);
use List::MoreUtils qw(uniq);
use Sub::Quote qw(quote_sub);

Expand Down Expand Up @@ -73,10 +73,10 @@ C<database_event>.
has perform_action_when => (
is => 'rw',
coerce => quote_sub(q{ defined $_[0] ? lc $_[0] : $_[0] }),
isa => sub {
throw("Invalid argument '$_[0]' to perform_action_when")
if defined $_[0] and $_[0] !~ m/^(before|after)$/i;
},
isa => enum([qw(before after)], {
msg => "Invalid argument '%s' to perform_action_when",
allow_undef => 1,
}),
);

around perform_action_when => \&ex2err;
Expand Down Expand Up @@ -281,11 +281,9 @@ Get or set the trigger's scope (row or statement).

has scope => (
is => 'rw',
isa => sub {
my ($arg) = @_;
throw( "Invalid scope '$arg'" )
if defined $arg and $arg !~ /^(row|statement)$/i;
},
isa => enum([qw(row statement)], {
msg => "Invalid scope '%s'", icase => 1, allow_undef => 1,
}),
);

around scope => \&ex2err;
Expand Down
59 changes: 57 additions & 2 deletions lib/SQL/Translator/Types.pm
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@ SQL::Translator::Types - Type checking functions
package Foo;
use Moo;
use SQL::Translator::Types qw(schema_obj);
use SQL::Translator::Types qw(schema_obj enum);
has foo => ( is => 'rw', isa => schema_obj('Trigger') );
has bar => ( is => 'rw', isa => enum([q(baz quux quuz)], {
msg => "Invalid value for bar: '%s'", icase => 1,
});
=head1 DESCRIPTIONS
Expand All @@ -26,7 +29,7 @@ use SQL::Translator::Utils qw(throw);
use Scalar::Util qw(blessed);

use Exporter qw(import);
our @EXPORT_OK = qw(schema_obj);
our @EXPORT_OK = qw(schema_obj enum);

=head1 FUNCTIONS
Expand All @@ -47,4 +50,56 @@ sub schema_obj {
};
}

=head2 enum(\@strings, [$msg | \%parameters])
Returns a coderef that checks that the argument is one of the provided
C<@strings>.
=head3 Parameters
=over
=item msg
L<sprintf|perlfunc/sprintf> string for the error message.
If no other parameters are needed, this can be provided on its own,
instead of the C<%parameters> hashref.
The invalid value is passed as the only argument.
Defaults to C<Invalid value: '%s'>.
=item icase
If true, folds the values to lower case before checking for equality.
=item allow_undef
If true, allow C<undef> in addition to the specified strings.
=item allow_false
If true, allow any false value in addition to the specified strings.
=back
=cut

sub enum {
my ($values, $args) = @_;
$args ||= {};
$args = { msg => $args } unless ref($args) eq 'HASH';
my $icase = !!$args->{icase};
my %values = map { ($icase ? lc : $_) => undef } @{$values};
my $msg = $args->{msg} || "Invalid value: '%s'";
my $extra_test =
$args->{allow_undef} ? sub { defined $_[0] } :
$args->{allow_false} ? sub { !!$_[0] } : undef;

return sub {
my $val = $icase ? lc $_[0] : $_[0];
throw(sprintf($msg, $val))
if (!defined($extra_test) || $extra_test->($val))
&& !exists $values{$val};
};
}

1;

0 comments on commit 4c3f67f

Please sign in to comment.