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 )