Skip to content

Commit

Permalink
fix builder cancel and delete; lookup fix builder version
Browse files Browse the repository at this point in the history
  • Loading branch information
nics committed Oct 20, 2017
1 parent f29d031 commit 3575553
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 55 deletions.
27 changes: 27 additions & 0 deletions lib/Catmandu/Emit.pm
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,22 @@ sub _emit_iterate_hash {
$perl;
}

sub _emit_assign_cb {
my ($self, $var, $cb_var, %opts) = @_;
my $val_var = $self->_generate_var;
my $cancel_var = $self->_generate_var;
my $delete_var = $self->_generate_var;
my $perl = "";
$perl
.= "my (${val_var}, ${cancel_var}, ${delete_var}) = ${cb_var}->(${var});";
$perl .= "if (${delete_var}) {";
$perl .= $self->_emit_delete(%opts);
$perl .= "} elsif (!${cancel_var}) {";
$perl .= $self->_emit_assign($var, $val_var, %opts);
$perl .= "}";
$perl;
}

sub _emit_assign {
my ($self, $var, $val, %opts) = @_;
my $l_var = $var;
Expand All @@ -92,6 +108,17 @@ sub _emit_assign {
"${l_var} = ${val};";
}

sub _emit_delete {
my ($self, %opts) = @_;
my $up_var = $opts{up_var};
if (my $key = $opts{key}) {
return "delete ${up_var}->{${key}}";
}
elsif (my $index = $opts{index}) {
return "splice(\@{${up_var}}, ${index}, 1)";
}
}

sub _emit_value {
my ($self, $val) = @_;
return 'undef' unless defined $val;
Expand Down
4 changes: 2 additions & 2 deletions lib/Catmandu/Fix/capitalize.pm
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ use Catmandu::Util qw(as_path as_utf8);
use namespace::clean;
use Catmandu::Fix::Has;

has path => (fix_arg => 1);

with 'Catmandu::Fix::Builder';

has path => (fix_arg => 1);

sub _build_fixer {
my ($self) = @_;
as_path($self->path)
Expand Down
65 changes: 22 additions & 43 deletions lib/Catmandu/Fix/lookup.pm
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,16 @@ use Catmandu::Sane;
our $VERSION = '1.0606';

use Catmandu::Importer::CSV;
use Catmandu::Util qw(is_value as_path);
use Moo;
use namespace::clean;
use Catmandu::Fix::Has;

with 'Catmandu::Fix::Base';
with 'Catmandu::Fix::Builder';

has path => (fix_arg => 1);
has file => (fix_arg => 1);
has default => (fix_opt => 1);
has default => (fix_opt => 1, predicate => 1);
has delete => (fix_opt => 1);
has csv_args => (fix_opt => 'collect');
has dictionary => (is => 'lazy', init_arg => undef);
Expand All @@ -35,48 +36,26 @@ sub _build_dictionary {
);
}

sub emit {
my ($self, $fixer) = @_;
my $path = $fixer->split_path($self->path);
my $key = pop @$path;
my $dict_var = $fixer->capture($self->dictionary);
my $delete = $self->delete;
my $default = $self->default;

$fixer->emit_walk_path(
$fixer->var,
$path,
sub _build_fixer {
my ($self) = @_;
my $path = as_path($self->path);
my $dict = $self->dictionary;
my $has_default = $self->has_default;
my $default = $self->default;
my $delete = $self->delete;
$path->updater(
sub {
my $var = shift;
$fixer->emit_get_key(
$var, $key,
sub {
my $val_var = shift;
my $val_index = shift;
my $dict_val_var = $fixer->generate_var;
my $perl
= "if (is_value(${val_var}) && defined(my ${dict_val_var} = ${dict_var}->{${val_var}})) {"
. "${val_var} = ${dict_val_var};" . "}";
if ($delete) {
$perl .= "else {";
if (defined $val_index)
{ # wildcard: only delete the value where the lookup failed
$perl .= "splice(\@{${var}}, ${val_index}--, 1);";
}
else {
$perl .= $fixer->emit_delete_key($var, $key);
}
$perl .= "}";
}
elsif (defined $default) {
$perl
.= "else {"
. "${val_var} = "
. $fixer->emit_value($default) . ";" . "}";
}
$perl;
}
);
my $val = $_[0];
if (is_value($val) && defined(my $new_val = $dict->{$val})) {
return $new_val;
}
elsif ($delete) {
return undef, 1, 1;
}
elsif ($has_default) {
return $default;
}
return undef, 1, 0;
}
);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/Catmandu/Fix/rename.pm
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ has replace => (fix_arg => 1);
with 'Catmandu::Fix::Builder';

sub _build_fixer {
my ($self) = @_;
my ($self) = @_;
my $search = $self->search;
my $replace = $self->replace;
my $renamer;
Expand Down
17 changes: 8 additions & 9 deletions lib/Catmandu/Path/default.pm
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ sub getter {
}

sub setter {
my $self = shift;
my %opts = @_ == 1 ? (value => $_[0]) : @_;
my $self = shift;
my %opts = @_ == 1 ? (value => $_[0]) : @_;
my $path = $self->split_path;
my $key = pop @$path;
my $data_var = $self->_generate_var;
Expand Down Expand Up @@ -83,8 +83,8 @@ sub setter {
}

sub updater {
my $self = shift;
my %opts = @_ == 1 ? (value => $_[0]) : @_;
my $self = shift;
my %opts = @_ == 1 ? (value => $_[0]) : @_;
my $path = $self->split_path;
my $data_var = $self->_generate_var;
my $captures = {};
Expand All @@ -107,8 +107,7 @@ sub updater {
$perl
.= 'if ('
. join(' || ', map {"is_${_}(${var})"} @$pred) . ') {'
. $self->_emit_assign($var, "${val_var}->(${var})", %opts)
. '}';
. $self->_emit_assign_cb($var, $val_var, %opts) . '}';
}
$perl;
};
Expand All @@ -123,7 +122,7 @@ sub updater {
}
$cb = sub {
my ($var, %opts) = @_;
$self->_emit_assign($var, "${val_var}->(${var})", %opts);
$self->_emit_assign_cb($var, $val_var, %opts);
};
}

Expand All @@ -133,8 +132,8 @@ sub updater {
}

sub creator {
my $self = shift;
my %opts = @_ == 1 ? (value => $_[0]) : @_;
my $self = shift;
my %opts = @_ == 1 ? (value => $_[0]) : @_;
my $path = $self->split_path;
my $data_var = $self->_generate_var;
my $val_var = $self->_generate_var;
Expand Down

0 comments on commit 3575553

Please sign in to comment.