ETOOBUSY 🚀 minimal blogging for the impatient
App::Easer example
TL;DR
An example usage of App-Easer.
In previous post App::Easer I introduced App-Easer, a module to ease the implementation of command-line utilities that want to take a hierarchical approach.
Let’s see an example, straight from the SYNOPSIS:
#!/usr/bin/env perl
use v5.24;
use App::Easer 'run';
my $app = {
commands => {
MAIN => {
name => 'main app',
help => 'this is the main app',
description => 'Yes, this really is the main app',
options => [
{
name => 'foo',
description => 'option foo!',
getopt => 'foo|f=s',
environment => 'FOO',
default => 'bar',
},
],
execute => sub ($global, $conf, $args) {
my $foo = $conf->{foo};
say "Hello, $foo!";
return 0;
},
'default-child' => '', # run execute by default
},
},
};
exit run($app, [@ARGV]);
Let’s save this as example.pl.
This application contains one command, i.e. the entry point one. This
MUST be called MAIN
.
Our main command supports two sub-commands, namely help
and
commands
. As such, it’s already a hiearrchical CLI application! In
addition to this, though, the command itself has an execute
field that
can be used to actually execute something.
Let’s see how it behaves. First, we just call it:
$ ./example.pl
Hello, bar!
In this case, we are not providing any sub-command and we set the
default-child
to the empty string (i.e. a false value), hence the
execute
will be called.
This sub is passed three parameters ($global
, $conf
, and $args
);
the first one is a global tracker for the whole application, which will
be overkill in most occasions; more interestingly, $conf
and $args
contain the collected options for our command (foo
in our case) and
the residual arguments after parsing the command-line arguments.
In our case we didn’t set anything for foo
, so it gets its default
value bar
, hence the output message.
At this point we can start playing with foo
:
$ ./example.pl --foo World
Hello, World!
$ FOO=whatever ./example.pl
Hello, whatever!
$ FOO=whatever ./example.pl --foo World
Hello, World!
As expected, the value for option foo
is collected from various
sources, including the command-line arguments (which has the highest
priority) and the environment (via variable FOO
).
Let’s now see which sub-commands are supported:
$ ./example.pl commands
$ perl lib/App/Easer.pm commands
help: print a help message
commands: list sub-commands
As expected, the two stock sub-commands for getting some help to use
the CLI program are there for us; command
lists them, with the
synthetic `help.
Let’s see the full help
now:
$ ./example.pl help
this is the main app
Description:
Yes, this really is the main app
Options:
foo:
command-line: mandatory string option
--foo <value>
-f <value>
environment : FOO
default : bar
Sub commands:
help: print a help message
commands: list sub-commands
The help
and the description
are nicely printed out, along with an
automatically generated help section regarding the available options
and, when present, a list of supported sub-commands (just like
commands
above).
It’s also possible to look into the help for the sub-commands though,
including help
and commands
themselves:
$ ./example.pl help help
print a help message
Description:
print help for (sub)command
This command has no options.
$ ./example.pl help commands
list sub-commands
Description:
Print list of supported sub-commands
This command has no options.
Last, we can expect errors in typing sub-commands:
$ ./example.pl inexistent
cannot find sub-command 'inexistent'
$ ./example.pl help inexistent
cannot find sub-command 'inexistent'
I hope this has been a good T-Easer for App-Easer… it will surely benefit some future me that will be wondering how to use it!