diff --git a/Build.PL b/Build.PL index 82b0cd5..eecdc72 100644 --- a/Build.PL +++ b/Build.PL @@ -8,6 +8,7 @@ my $build = Module::Build->new( requires => { 'Mojolicious' => 0, 'JSON' => 0, + 'Const::Fast' => 0, }, ); $build->create_build_script; diff --git a/bin/tdtcli.pl b/bin/tdtcli.pl index 9e10e45..456dc7d 100644 --- a/bin/tdtcli.pl +++ b/bin/tdtcli.pl @@ -9,11 +9,43 @@ use Data::Dumper; use Term::ReadLine; use FileHandle; +use Const::Fast; use Mojo::UserAgent; use JSON; binmode STDOUT, ':utf8'; +const my $COMMANDS => { + countries => { + description => 'List available countries.', + action => \&show_countries, + }, + select_country => { + description => 'Select a country.', + action => \&select_country + }, + ambits => { + description => 'List available ambits.', + action => \&show_ambits + }, + select_ambit => { + description => 'Select a ambit.', + action => \&select_ambit + }, + channnels => { + description => 'List available channels.', + action => \&show_channels + }, + select_channel => { + description => 'Select a channel.', + action => \&select_channel + }, + help => { + description => 'Show this help.', + action => \&show_help + } +}; + my $ua = Mojo::UserAgent->new; my $tdt_channels = decode_json( $ua->get('https://www.tdtchannels.com/lists/tv.json')->result->body ); @@ -23,10 +55,13 @@ my $countries = $tdt_channels->{countries}; my $selected_country; my $selected_ambit; -my $term = Term::ReadLine->new('tdtcli'); +my $term = Term::ReadLine->new('tdtcli'); +my $attribs = $term->Attribs; +$attribs->{completion_entry_function} = $attribs->{list_completion_function}; +$attribs->{completion_word} = [ keys %$COMMANDS ]; while ( defined( my $line = $term->readline('~> ') ) ) { - proccess_line($line); + process_line($line); $term->addhistory($line); if ( defined $selected_country ) { @@ -38,29 +73,34 @@ while ( defined( my $line = $term->readline('~> ') ) ) { } } -sub proccess_line { +sub process_line { my $line = shift; return unless defined $line; my @line = split /\s+/, $line; return unless defined $line[0]; my $command = shift @line; - show_countries() if $command eq 'countries'; - select_country( [@line] ) if $command eq 'select_country'; - show_ambits() if $command eq 'ambits'; - select_ambit( [@line] ) if $command eq 'select_ambit'; - show_channels() if $command eq 'channels'; - select_channel( [@line] ) if $command eq 'select_channel'; + say("No such command $command."), return + unless exists $COMMANDS->{$command}; + $COMMANDS->{$command}{action}->( [@line] ); +} + +sub show_help { + say <<'EOF'; +TDTCli help page: +EOF + for my $command ( sort { $a cmp $b } keys %$COMMANDS ) { + say "$command : $COMMANDS->{$command}{description}"; + } } sub select_channel { my $arguments = shift; + say('You must first select a ambit with select_ambit'), return + unless defined $selected_ambit; say('You must pass a channel number.'), return unless exists $arguments->[0]; my $channel = $arguments->[0]; return unless $channel =~ /^\d+$/; - say('You must first select a ambit with /select_ambit'), - return undef $selected_ambit - unless defined $selected_ambit; my $ambits = $countries->[$selected_country]{ambits}; my $channels = $ambits->[$selected_ambit]{channels}; my $current_channel_options = $channels->[$channel]{options}; @@ -78,7 +118,7 @@ sub select_channel { } sub show_channels { - say('You must first select a ambit with /select_ambit'), return + say('You must first select a ambit with select_ambit'), return unless defined $selected_ambit; my $names = [ map { $_->{name} } @@ -93,24 +133,24 @@ sub show_channels { sub select_ambit { my $arguments = shift; - say('You must first select a country with /select_country'), return + say('You must first select a country with select_country'), return unless defined $selected_country; - say('No ambit passed see /ambits'), return + say('No ambit passed see ambits'), return unless defined $arguments->[0]; my $ambit = $arguments->[0]; return unless $ambit =~ /^\d+$/; - say('Such ambit doesn\'t exists see /ambits'), return + say('Such ambit doesn\'t exists see ambits'), return unless exists $countries->[$selected_country]{ambits}[$ambit]; $selected_ambit = $ambit; } sub select_country { my $arguments = shift; - say('No country passed see /countries'), return + say('No country passed see countries'), return unless defined $arguments->[0]; my $country = $arguments->[0]; return unless $country =~ /^\d+$/; - say('Such country doesn\'t exists see /countries'), return + say('Such country doesn\'t exists see countries'), return if !exists $countries->[$country]; $selected_country = $country; undef $selected_ambit;