CLI.pm 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. # ------------------------------------------------------------------------------
  2. # (C) Crown copyright Met Office. All rights reserved.
  3. # For further details please refer to the file COPYRIGHT.txt
  4. # which you should have received as part of this distribution.
  5. # ------------------------------------------------------------------------------
  6. use strict;
  7. use warnings;
  8. package Fcm::Interactive::InputGetter::CLI;
  9. use base qw{Fcm::Interactive::InputGetter};
  10. my $DEF_MSG = q{ (or just press <return> for "%s")};
  11. my %EXTRA_MSG_FOR = (
  12. yn => qq{\nEnter "y" or "n"},
  13. yna => qq{\nEnter "y", "n" or "a"},
  14. );
  15. my %CHECKER_FOR = (
  16. yn => sub {$_[0] eq 'y' || $_[0] eq 'n'},
  17. yna => sub {$_[0] eq 'y' || $_[0] eq 'n' || $_[0] eq 'a'},
  18. );
  19. sub invoke {
  20. my ($self) = @_;
  21. my $type = $self->get_type() ? lc($self->get_type()) : q{};
  22. my $message
  23. = $self->get_message()
  24. . (exists($EXTRA_MSG_FOR{$type}) ? $EXTRA_MSG_FOR{$type} : q{})
  25. . ($self->get_default() ? sprintf($DEF_MSG, $self->get_default()) : q{})
  26. . q{: }
  27. ;
  28. while (1) {
  29. print($message);
  30. my $answer = readline(STDIN);
  31. chomp($answer);
  32. if (!$answer && $self->get_default()) {
  33. $answer = $self->get_default();
  34. }
  35. if (!exists($CHECKER_FOR{$type}) || $CHECKER_FOR{$type}->($answer)) {
  36. return $answer;
  37. }
  38. }
  39. return;
  40. }
  41. 1;
  42. __END__
  43. =head1 NAME
  44. Fcm::Interactive::InputGetter::CLI
  45. =head1 SYNOPSIS
  46. use Fcm::Interactive;
  47. $answer = Fcm::Interactive::get_input(
  48. title => 'My title',
  49. message => 'Would you like to ...?',
  50. type => 'yn',
  51. default => 'n',
  52. );
  53. =head1 DESCRIPTION
  54. This is a solid implementation of
  55. L<Fcm::Interactive::InputGetter|Fcm::Interactive::InputGetter>. It gets a user
  56. reply from STDIN using a prompt on STDOUT.
  57. =head1 METHODS
  58. See L<Fcm::Interactive::InputGetter|Fcm::Interactive::InputGetter> for a list of
  59. methods.
  60. =head1 TO DO
  61. Use IO::Prompt.
  62. =head1 SEE ALSO
  63. L<Fcm::Interactive|Fcm::Interactive>,
  64. L<Fcm::Interactive::InputGetter|Fcm::Interactive::InputGetter>,
  65. L<Fcm::Interactive::InputGetter::GUI|Fcm::Interactive::InputGetter::GUI>
  66. =head1 COPYRIGHT
  67. E<169> Crown copyright Met Office. All rights reserved.
  68. =cut