—package
App::ConMenu;
use
5.10.0;
use
strict;
use
warnings;
use
YAML::Tiny;
our
$VERSION
=
"1.00"
;
sub
new {
my
$type
=
shift
;
my
$self
= {};
return
bless
$self
,
$type
;
}
# load the yaml file you should have
# set filename by now.
sub
loadMenuFile {
my
$self
=
shift
;
$self
->{fileName} or croak (
"No yaml file Name set"
);
my
$yaml
;
$yaml
= YAML::Tiny ->
read
(
$self
->{fileName});
$self
->{
'menu'
}=
$yaml
;
return
$yaml
;
}
sub
execute {
my
$self
=
shift
;
my
$commandStructure
=
shift
;
my
$commands
=
$commandStructure
->{
'commands'
};
foreach
my
$command
(
@$commands
)
{
`
$command
`;
}
return
1;
# return 1 so that testing knows we got this far.
}
sub
printMenu {
my
$self
=
shift
;
my
$menuItemsUnsorted
=
$self
->{
'menu'
}->[0];
my
@menuItems
=
sort
{ {
$a
} cmp {
$b
} }
keys
(
%$menuItemsUnsorted
);
$self
->{menuItems} = \
@menuItems
;
cls();
my
$i
=1;
my
@menuItemsNumerical
=
map
{
'['
.
$i
++.
'] '
.
$_
}
@menuItems
;
say
join
(
"\n"
,
@menuItemsNumerical
);
say
'Choose a menu item by pressing the corresponding number'
;
say
'q to exit'
;
}
sub
waitForInput {
my
$self
=
shift
;
my
$selection
= <>;
if
(
$selection
=~ /[0-9]+/){
if
(
$selection
>
scalar
(
$self
->{menuItems}) or
$selection
< 1 ){
say
'Error no such menu item'
;
exit
;
}
}
else
{
exit
;
}
my
$menuItems
=
$self
->{menuItems};
$self
->execute(
$self
->{menu}->[0]->{
$menuItems
->[
$selection
-1]})
}
# create a default file to get people going.
sub
createDefaultFile{
my
$self
=
shift
;
my
$fileName
=
shift
;
my
$menu
= {
'Menu option 1'
=> {
'commands'
=> [
'ls'
],
'working_dir'
=>
'./'
},
'Menu Option 2'
=> {
'commands'
=> [
'dir'
],
'working_dir'
=>
'./'
}
};
my
$yaml
= YAML::Tiny->new(
$menu
);
$yaml
->
write
(
$fileName
);
}
1;
__END__
=encoding utf-8
=head1 NAME
App::ConMenu - Very simple Menu For Console commands Platform Agnostic
=head1 SYNOPSIS
use App::ConMenu;
my $menu = App::ConMenu->new();
$menu->{fileName} = '.~/menu.yml';
$menu->loadMenuFile();
$menu->printMenu();
$menu->waitForInput();
1;
=head1 DESCRIPTION
App::ConMenu is a very simple console menu application it allows you to display a menu of
choices then select one of those by pressing the corresponding number. This will cause ComMenu
to execute the associated commands in the menu.yml file.
The C<m.pl> in the scripts dir is a script that creates a menu by using the module. By default
the script uses ~/.con_menu.yml on unix type systems and <HOMEDIR>\_con_menu.yml on Windows type systems. If
the files do not exist then you will be prompted to create an example version.
=head1 LICENSE
Copyright (C) Michael Mueller.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=head1 AUTHOR
Michael Mueller E<lt>michael@muellers.net.auE<gt>
=cut