App-Spec-Bash
view release on metacpan or search on metacpan
lib/App/Spec/Bash.pm view on Meta::CPAN
cmd2:
op: cmd2
summary: Command2
options:
- verbose|v+ --Verbose output (can be used multiple times)
parameters:
- +name --Some required parameter
EOM
my $script = sprintf <<'EOM', $name;
#!/usr/bin/env bash
DIR="$( dirname $BASH_SOURCE )"
APPSPECDIR="$DIR/.."
source "$APPSPECDIR/lib/appspec"
source "$APPSPECDIR/lib/%s"
APPSPEC.run $@
EOM
my $module = <<"EOM";
#!/usr/bin/env bash
$class.cmd1() {
APPSPEC.say "Running command 1" BOLD
APPSPEC.say "flag-a: \$OPT_FLAG_A"
APPSPEC.say "flag-b: \$OPT_FLAG_B"
APPSPEC.say "opt-x: '\$OPT_OPT_X'"
APPSPEC.say "opt-y: (\${OPT_OPT_Y[*]})"
}
$class.cmd2() {
APPSPEC.say "Running command 2" MAGENTA
APPSPEC.say "verbose: \$OPT_VERBOSE"
APPSPEC.say "name: \$PARAM_NAME"
}
EOM
if (-e $dir) {
unless ($overwrite) {
say "Remove directory '$dir' first or use --overwrite...";
return;
}
say "Removing directory '$dir' first...";
remove_tree $dir, { verbose => 1 };
}
make_path(
"$dir/bin", "$dir/lib", "$dir/share/completion/zsh",
"$dir/share/completion/bash", { verbose => 1 });
say "Creating $dir/share/$name.yaml ...";
open my $fh, '>', "$dir/share/$name.yaml" or die $!;
print $fh $spec;
close $fh;
say "Creating $dir/bin/$name ...";
open $fh, '>', "$dir/bin/$name" or die $!;
print $fh $script;
close $fh;
chmod 0755, "$dir/bin/$name" or die $!;
say "Creating $dir/lib/$name ...";
open $fh, '>', "$dir/lib/$name" or die $!;
print $fh $module;
close $fh;
say <<"EOM";
Created skeleton in $dir.
To generate the parser and help, do:
% cd $dir
% appspec-bash generate parser share/$name.yaml lib/appspec
% appspec-bash generate help share/$name.yaml lib/help
Try it out:
% bin/$name cmd1 -ab --opt-x x -yfoo --opt-y bar
% bin/$name cmd2 -vvv
% bin/$name cmd2 -vvv foo
EOM
}
sub genhelp {
my ($self, $run) = @_;
my $params = $run->parameters;
my $bashfile = $params->{output};
my $specfile = $params->{spec};
my $spec = App::Spec->read($specfile);
my $appspec_version = App::Spec->VERSION;
my $appspec_bash_version = App::Spec::Bash->VERSION;
my %help;
my $help = $self->generate_help(
help => \%help,
spec => $spec,
cmdspec => $spec,
commands => [],
);
my $functions = '';
for my $func (sort keys %help) {
my $code = <<"EOM";
APPSPEC.help-$func() {
cat <<EOHELP
$help{ $func }
EOHELP
}
EOM
$functions .= $code;
}
my $bash = <<"EOM";
#!/bin/bash
# Generated by perl modules
# App::Spec v$appspec_version
# App::Spec::Bash v$appspec_bash_version
APPSPEC.help() {
cat <<EOHELP
( run in 1.685 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )