App-riap
view release on metacpan or search on metacpan
lib/App/riap.pm view on Meta::CPAN
use warnings;
#use experimental 'smartmatch';
use Log::ger;
use parent qw(Term::Shell);
use Color::ANSI::Util qw(ansifg);
use Data::Clean::ForJSON;
use Path::Naive qw(concat_and_normalize_path);
use Perinci::Sub::Util qw(err);
use Term::Detect::Software qw(detect_terminal_cached);
use Time::HiRes qw(time);
my $cleanser = Data::Clean::ForJSON->get_cleanser;
sub new {
require CHI;
require Getopt::Long;
require Perinci::Access;
require URI;
my ($class, %args) = @_;
binmode(STDOUT, ":encoding(utf8)");
my %opts;
my @gospec = (
"help" => sub {
print <<'EOT';
Usage:
riap --help
riap --version, -v
riap [opts] [server-uri]
Options:
--help Show this help message
--version, -v Show version and exit
--user=S, -u Supply HTTP authentication user
--password=S, -p Supply HTTP authentication password
Examples:
% riap
% riap https://cpanlists.org/api/
For more help, see the manpage.
EOT
exit 0;
},
"version|v" => sub {
say "riap version " . ($App::riap::VERSION // "dev");
exit 0;
},
"user|u=s" => \$opts{user},
"password|p=s" => \$opts{password},
);
my $old_go_opts = Getopt::Long::Configure();
Getopt::Long::GetOptions(@gospec);
Getopt::Long::Configure($old_go_opts);
$class->_install_cmds;
my $self = $class->SUPER::new();
$self->load_history;
# load from file
$self->load_settings;
# override some settings from env, if available
# ...
$self->{_in_completion} = 0;
# for now we don't impose cache size limit
$self->{_cache} = CHI->new(driver=>'Memory', global=>1);
# determine color support
$self->{use_color} //=
(defined $ENV{NO_COLOR} ? 0 : undef) //
$ENV{COLOR} //
detect_terminal_cached()->{color};
# override some settings from cmdline args, if defined
$self->{_pa} //= Perinci::Access->new;
$self->setting(user => $opts{user}) if defined $opts{user};
$self->setting(password => $opts{password}) if defined $opts{password};
# determine starting pwd
my $pwd;
my $surl = URI->new($ARGV[0] // "/");
$self->state(server_url => $surl);
my $res = $self->riap_parse_url($surl);
die "Can't parse url $surl\n" unless $res;
$pwd = $res->{path};
$self->state(pwd => $pwd);
$self->state(start_pwd => $pwd);
$self->run_cd($pwd);
$self;
}
# override, readline workarounds
sub cmdloop {
require Carp;
require IO::Stty;
require Signal::Safety;
my $o = shift;
my $rl = $o->{term};
local $SIG{INT} = sub {
# save history when we are interrupted
$o->save_history;
print STDERR "Interrupted\n";
if ($rl->ReadLine eq 'Term::ReadLine::Gnu') {
IO::Stty::stty(\*STDIN, 'echo');
}
exit 1;
};
local $SIG{__DIE__} = sub {
IO::Stty::stty(\*STDIN, 'echo');
$o->setting('debug_stack_trace') ? Carp::confess(@_) : die(@_);
( run in 2.343 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )