App-Memcached-CLI
view release on metacpan or search on metacpan
lib/App/Memcached/CLI/Main.pm view on Meta::CPAN
}
GetOptions(
\my %opts, 'addr|a=s', 'timeout|t=i',
'debug|d', 'help|h', 'man',
) or return +{};
if (defined $opts{debug}) {
$App::Memcached::CLI::DEBUG = 1;
}
%params = (%opts, %params);
$params{addr} = create_addr($params{addr});
return \%params;
}
sub run {
my $self = shift;
if (@ARGV) {
$self->run_batch;
} else {
$self->run_interactive;
}
}
sub run_batch {
my $self = shift;
debug "Run batch mode with @ARGV" if (@ARGV);
my ($_command, @args) = @ARGV;
my $command = $COMMAND_OF{$_command};
unless ($command) {
print "Unknown command - $_command\n";
return;
} elsif ($command eq 'quit') {
print "Nothing to do with $_command\n";
return;
}
my $ret = $self->$command(@args);
unless ($ret) {
print qq[Command seems failed. Run \`$PROGRAM help\` or \`$PROGRAM help $command\` for usage.\n];
}
}
sub run_interactive {
my $self = shift;
debug "Start interactive mode. $self->{addr}";
my $isa_tty = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT));
unless ($isa_tty) {
croak "TTY Not Found! Quit.";
}
my $exit_loop = 0;
local $SIG{INT} = local $SIG{QUIT} = sub {
$exit_loop = 1;
warn "Caught INT or QUIT. Exiting...";
};
$self->{term} = Term::ReadLine->new($PROGRAM);
print "Type '\\h' or 'help' to show help.\n\n";
while (! $exit_loop) {
my ($command, @args) = $self->prompt;
next unless $command;
if ($command eq 'quit') {
$exit_loop = 1;
next;
}
unless ($self->{ds}->ping) {
print "Server has gone away.\n";
$exit_loop = 1;
next;
}
my $ret = $self->$command(@args);
unless ($ret) {
print "Command seems failed. Type \\h $command for help.\n\n";
}
}
debug "Finish interactive mode. $self->{addr}";
}
sub prompt {
my $self = shift;
local $| = 1;
local $\;
my $input = $self->{term}->readline("memcached\@$self->{addr}> ");
chomp($input);
return unless $input;
$self->{term}->addhistory($input) if ($input =~ m/\S/);
my ($_command, @args) = split(m/\s+/, $input);
my $command = $COMMAND_OF{$_command};
print "Unknown command - $input\n" unless $command;
return $command, @args;
}
sub help {
my $self = shift;
my $command = shift || q{};
my @command_info = @App::Memcached::CLI::Help::COMMANDS_INFO;
my $body = q{};
my $space = ' ' x 4;
# Help for specified command
if (my $function = $COMMAND_OF{$command}) {
my $aliases = join(q{, }, _sorted_aliases_of($function));
my $info = (grep { $_->{command} eq $function } @command_info)[0];
$body .= sprintf qq{\n[Command "%s"]\n\n}, $command;
$body .= "Summary:\n";
$body .= sprintf "%s%s\n\n", $space, $info->{summary};
$body .= "Aliases:\n";
$body .= sprintf "%s%s\n\n", $space, $aliases;
if ($info->{description}) {
$body .= $info->{description};
$body .= "\n";
}
print $body;
return 1;
}
# Command not found, but continue
elsif ($command) {
$body .= "Unknown command: $command\n";
}
# General help
$body .= "\n[Available Commands]\n";
for my $info (@command_info) {
my $cmd = $info->{command};
my $commands = join(q{, }, _sorted_aliases_of($cmd));
$body .= sprintf "%s%-20s%s%s\n",
$space, $commands, $space x 2, $info->{summary};
}
$body .= "\nType \\h <command> for each.\n\n";
print $body;
return 1;
}
( run in 1.104 second using v1.01-cache-2.11-cpan-6aa56a78535 )