MOP4Import-Declare
view release on metacpan or search on metacpan
Base/CLI_JSON.pm view on Meta::CPAN
sub _cli_xargs {
(my MY $self, my (@args)) = @_;
my cliopts__xargs $opts = $self->take_locked_opts_of(
cliopts__xargs, \@args, {0 => 'null'},
);
my ($subOrArray, @restPrefix) = @args;
$self->cli_precheck_apply($subOrArray);
local $/ = $opts->{null} ? "\0" : "\n";
local *ARGV;
if ($opts->{slurp} || $opts->{single}) {
my @all = $self->cli_slurp_xargs($opts);
$self->cli_apply(
$subOrArray, @restPrefix,
($opts->{single} ? \@all : @all)
);
} else {
my $decoder = defined $opts->{decode}
? $self->cli_decoder_from($opts->{decode}) : undef;
local $_;
if (not ref $subOrArray and $self->can("cmd_$subOrArray")) {
while (defined($_ = $self->cli_compat_diamond)) {
chomp;
$self->cli_apply(
$subOrArray, @restPrefix,
($decoder ? $decoder->($_) : $_)
)
}
$self->{'no-exit-code'} = 1;
();
} else {
my @result;
while (defined($_ = $self->cli_compat_diamond)) {
chomp;
# XXX: yield...
push @result, $self->cli_apply(
$subOrArray, @restPrefix,
($decoder ? $decoder->($_) : $_)
)
}
@result;
}
}
}
sub cli_slurp_xargs_json {
(my MY $self, my (@args)) = @_;
my cliopts__xargs $opts = $self->take_locked_opts_of(
cliopts__xargs, \@args, {0 => 'null'},
);
$opts->{decode} //= (($opts->{json} //=1) ? 'json' : '');
$self->cli_slurp_xargs($opts, @args);
}
sub cli_slurp_xargs {
(my MY $self, my (@args)) = @_;
my cliopts__xargs $opts = $self->take_locked_opts_of(
cliopts__xargs, \@args, {0 => 'null'},
);
local @ARGV = @args;
my $decoder = defined $opts->{decode}
? $self->cli_decoder_from($opts->{decode}) : undef;
map {
$decoder ? $decoder->($_) : $_
} $self->cli_compat_diamond
}
sub cli_decoder_from {
(my MY $self, my ($formatSpec, @rest)) = @_;
my ($format, @opts) = lexpand($formatSpec);
my $sub = $self->can("cli_decoder_from__$format")
or Carp::croak "Unknown decorder is requested: $format";
$sub->($self, @opts, @rest);
}
#
# pass-through decoder.
#
sub cli_decoder_from__ {
sub {$_[0]}
}
#
# json decoder
#
sub cli_decoder_from__json {
(my MY $self, my @opts) = @_;
my $decoder = $self->cli_json_decoder(qw/allow_nonref/, @opts);
sub {
my ($str) = @_;
Encode::_utf8_off($str);
$decoder->decode($str);
}
}
#========================================
sub declare_output_format {
(my $myPack, my Opts $opts, my ($formatName, $sub)) = m4i_args(@_);
my $encoderFuncName = "cli_encoder_to__$formatName";
my $writeFuncName = "cli_write_fh_as_$formatName";
my $outputFuncName = "cli_output_as_$formatName";
if (ref $sub eq 'CODE') {
*{globref($opts->{destpkg}, $writeFuncName)} = $sub;
*{globref($opts->{destpkg}, $outputFuncName)} = sub {
shift->$writeFuncName(\*STDOUT, $_[0]);
};
} elsif (not defined $sub) {
if ($opts->{destpkg}->can($writeFuncName)) {
*{globref($opts->{destpkg}, $outputFuncName)} = sub {
shift->$writeFuncName(\*STDOUT, $_[0]);
};
}
elsif ($opts->{destpkg}->can($encoderFuncName)) {
*{globref($opts->{destpkg}, $outputFuncName)} = sub {
shift->$encoderFuncName(\*STDOUT)->($_[0]);
};
unless ($opts->{destpkg}->can($writeFuncName)) {
( run in 1.537 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )