App-riap
view release on metacpan or search on metacpan
lib/App/riap.pm view on Meta::CPAN
sub comp_ {
require Complete::Bash;
require Complete::Util;
my $self = shift;
my ($cmd, $word0, $line, $start) = @_;
local $self->{_in_completion} = 1;
my @res = ("help", "exit");
push @res, grep {/\A\w+\z/} keys %App::riap::Commands::SPEC;
# add functions
my ($dir, $word) = $word0 =~ m!(.*/)?(.*)!;
$dir //= "";
my $pwd = $self->state("pwd");
my $uri = length($dir) ? concat_and_normalize_path($pwd, $dir) : $pwd;
$uri .= "/" unless $uri =~ m!/\z!;
my $extra = {detail=>1};
my $res = $self->riap_request(list => $uri, $extra);
if ($res->[0] == 200) {
for (@{ $res->[2] }) {
my $u = $_->{uri};
next unless $_->{type} =~ /\A(package|function)\z/;
$u =~ s!\A\Q$uri\E!!;
push @res, "$dir$u";
}
}
#use Data::Dump; dd \@res;
my $comp = Complete::Bash::format_completion(
{
path_sep => '/',
words => Complete::Util::complete_array_elem(
array=>\@res, word=>$word0),
},
{as => 'array'},
);
if ($self->setting("debug_completion")) {
say "DEBUG: Completion (1): ".join(", ", @$comp);
}
@$comp;
}
sub _err {
require Perinci::Result::Format;
my $self = shift;
print Perinci::Result::Format::format($_[0], "text");
}
sub catch_run {
my $self = shift;
my ($cmd, @argv) = @_;
my $pwd = $self->state("pwd");
my $uri = concat_and_normalize_path($pwd, $cmd);
my $res = $self->riap_request(info => $uri);
if ($res->[0] == 404) {
$self->_err([404, "No such command or executable (Riap function)"]);
return;
} elsif ($res->[0] != 200) {
$self->_err($res);
return;
}
unless ($res->[2]{type} eq 'function') {
$self->_err([412, "Not an executable (Riap function)"]);
return;
}
my $name = $res->[2]{uri}; $name =~ s!.+/!!;
$res = $self->riap_request(meta => $uri);
if ($res->[0] != 200) {
$self->_err(err(500, "Can't get meta", $res));
return;
}
my $meta = $res->[2];
$self->_run_cmd(
name=>$name, meta=>$meta, argv=>\@argv,
code=>sub {
my %args = @_;
delete $args{-shell};
$self->riap_request(call => $uri, {args=>\%args});
},
code_argv=>sub {
$self->riap_request(call => $uri, {argv=>\@_});
},
);
}
sub catch_comp {
require Perinci::Sub::Complete;
require Complete::Bash;
require Complete::Util;
my $self = shift;
my ($cmd, $word, $line, $start) = @_;
local $self->{_in_completion} = 1;
my $pwd = $self->state("pwd");
my $uri = concat_and_normalize_path($pwd, $cmd);
my $res = $self->riap_request(info => $uri);
return () unless $res->[0] == 200;
return () unless $res->[2]{type} eq 'function';
$res = $self->riap_request(meta => $uri);
return () unless $res->[0] == 200;
my $meta = $res->[2];
my ($words, $cword) = @{ Complete::Bash::parse_cmdline(
$line, $start+length($word), {truncate_current_word=>1}) };
($words, $cword) = @{ Complete::Bash::join_wordbreak_words(
$words, $cword) };
shift @$words; $cword--; # strip program name
$opts = {};
$res = Perinci::Sub::Complete::complete_cli_arg(
words => $words, cword => $cword,
meta => $meta, common_opts => $common_opts,
( run in 2.293 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )