DynGig-Util

 view release on metacpan or  search on metacpan

lib/DynGig/Util/CLI.pm  view on Meta::CPAN

=head1 NAME

DynGig::Util::CLI - An easy-to-print CLI menu for Getopt

=cut
package DynGig::Util::CLI;

use warnings;
use strict;

=head1 SYNOPSIS

 use DynGig::Util::CLI;
 use Getopt::Long;
 
 my %o = ( s => 30, link => 'current' );

 my $menu = DynGig::Util::CLI->new
 (
     'h|help',"print help menu",
     's|sleep=i',"[ $o{s} ] seconds between iterations",
     'link=s',"[ $o{link} ] symlink to current config",
     'server=s','server host:port',
 );

 my @option = $menu->option();
 my $string = $menu->string();

 die join "\n", "Usage:\tdefault value in [ ]", $string, "\n"
     unless Getopt::Long::GetOptions( \%o, @option ) && ! $o{h};

=cut
sub new
{
    my $class = shift @_;
    my ( @max, @menu, @option );
    my $max = 1;

    for ( my $i = 0; $i < @_; $i++ )
    {
        my $key = $_[$i];
        my @key = split /\|/, ( split( /[=!+:]/o, $key, 2 ) )[0];

        $max = @key if $max < @key;
        push @option, $key;
        push @menu, [ \@key, $_[++ $i] ];
    }

    for my $m ( @menu )
    {
        my $key = $m->[0];

        for ( my $i = @$key; $i < $max; $i ++ ) { unshift @$key, '' }
        for ( my $i = 0; $i < $max; $i ++ )
        {
            my $len = $m->[2][$i] = length $key->[$i];
            $max[$i] = $len unless $max[$i] && $max[$i] > $len;
        }
    }

    for my $m ( @menu )
    {
        my $key = $m->[0];

        for ( my $i = 0, my $len = pop @$m; $i < $max; $i ++ )
        {
            my $len = $len->[$i];
            my $wall = $len ? '|' : ' ';
            my $dash = $len > 1 ? '--' : $len ? ' -' : '  ';
            $key->[$i] = sprintf $dash.'%-'.$max[$i].'s%2s',
                $key->[$i], $wall;
        }

        $m->[0] = join ' ', @$key;
        chop $m->[0];
    }

    my $string = join "\n ", map { join ' ', @$_ } [], @menu;
    bless { string => $string, option => \@option  }, ref $class || $class;
}



( run in 0.652 second using v1.01-cache-2.11-cpan-71847e10f99 )