App-lms
view release on metacpan or search on metacpan
lib/App/lms.pm view on Meta::CPAN
package App::lms;
our $VERSION = "0.99";
use v5.14;
use warnings;
use utf8;
use Encode;
use open IO => 'utf8', ':std';
use Pod::Usage;
use List::Util qw(any first);
use App::lms::Util;
use Text::ParseWords qw(shellwords);
use Getopt::EX::Hashed; {
Getopt::EX::Hashed->configure(DEFAULT => [ is => 'rw' ]);
has one => ' 1 ' ;
has debug => ' d + ' ;
has dryrun => ' n ' ;
has raw => ' r ' ;
has help => ' h ' , action => sub {
pod2usage(-verbose => 99, -sections => [qw(SYNOPSIS)])
} ;
has list => ' l + ' ;
has man => ' m ' ;
has number => ' N ! ' , default => 0 ;
has version => ' v ' , action => sub { say "Version: $VERSION"; exit } ;
has pager => ' p =s ' ;
has suffix => ' =s ' , default => [ qw( .pm ) ] ;
has type => ' t =s ' , default => 'Command:Perl:Python:Ruby:Node' ;
has py => ' ' , action => sub { $_->type('Python') } ;
has pl => ' ' , action => sub { $_->type('Perl') } ;
has rb => ' ' , action => sub { $_->type('Ruby') } ;
has nd => ' ' , action => sub { $_->type('Node') } ;
has bat_theme => ' % ' ,
default => { light => 'Coldark-Cold', dark => 'Coldark-Dark' } ;
has skip => ' =s@ ' ,
default => [ $ENV{OPTEX_BINDIR} || ".optex.d/bin" ] ;
} no Getopt::EX::Hashed;
sub run {
my $app = shift;
@_ = map { utf8::is_utf8($_) ? $_ : decode('utf8', $_) } @_;
local @ARGV = splice @_;
use Getopt::EX::Long qw(GetOptions Configure ExConfigure);
ExConfigure BASECLASS => [ __PACKAGE__, "Getopt::EX" ];
Configure qw(bundling no_getopt_compat);
$app->getopt || pod2usage();
my $name = pop @ARGV;
if (!defined $name) {
if ($app->man) {
my $script = $ENV{LMS_SCRIPT_PATH} // $0;
exec 'perldoc', $script;
die "perldoc: $!\n";
}
pod2usage();
}
my @option = splice @ARGV;
my $pager = $app->pager || $ENV{'LMS_PAGER'} || _default_pager($app);
my @found;
my $found_type;
for my $type (split /:+/, $app->type) {
$type = _normalize_type($type);
my $handler = __PACKAGE__ . '::' . $type;
warn "Trying handler: $type\n" if $app->debug;
no strict 'refs';
if (eval "require $handler") {
my @paths = grep { defined } &{"$handler\::get_path"}($app, $name);
if (@paths) {
warn "Found by $type: @paths\n" if $app->debug;
push @found, @paths;
$found_type //= $type;
last if $app->one;
} else {
warn "Not found by $type\n" if $app->debug;
}
} else {
warn $@;
}
}
if (not @found) {
warn "$name: Nothing found.\n";
return 1;
}
if (my $level = $app->list) {
if ($level > 1) {
system 'ls', '-l', @found;
} else {
say for @found;
}
return 0;
}
if ($app->man) {
my $handler = __PACKAGE__ . '::' . $found_type;
no strict 'refs';
my @cmd = &{"$handler\::man_cmd"}($app, $name, $found[0]);
if ($app->dryrun) {
say "@cmd";
( run in 3.163 seconds using v1.01-cache-2.11-cpan-5a3173703d6 )