File Coverage

blib/lib/IO/Prompt/Timeout.pm
Criterion Covered Total %
statement 37 47 78.7
branch 7 14 50.0
condition 7 17 41.1
subroutine 9 9 100.0
pod 2 2 100.0
total 62 89 69.6


line stmt bran cond sub pod time code
1             package IO::Prompt::Timeout;
2 3     3   35972 use 5.008001;
  3         10  
  3         99  
3 3     3   13 use strict;
  3         3  
  3         77  
4 3     3   19 use warnings;
  3         3  
  3         79  
5              
6 3     3   2876 use IO::Select;
  3         4046  
  3         207  
7              
8 3     3   1387 use parent qw(Exporter);
  3         725  
  3         16  
9             our @EXPORT_OK = qw(prompt has_prompt_timed_out);
10             our %EXPORT_TAGS = (all => \@EXPORT_OK);
11              
12 3     3   221 use Carp ();
  3         5  
  3         1085  
13              
14             our $VERSION = "0.04";
15              
16             my $HAS_TIMED_OUT;
17             my $DEFAULT_TIMEOUT_SEC = 60;
18              
19             sub prompt {
20 3     3 1 3801 my $message = shift;
21 3 100       9 unless ($message) {
22 1         157 Carp::croak(q["prompt" called without any argument!]);
23             }
24              
25             # Clear timeout info.
26 2         3 undef $HAS_TIMED_OUT;
27              
28 2         6 my %opt = _parse_args(@_);
29              
30 2   33     15 my $isa_tty = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ;
31              
32 2 50       8 my $default_answer = exists $opt{default_answer} ? $opt{default_answer} : q{};
33 2 100       6 my $dispdef = $default_answer ? "[$default_answer]" : q{ };
34              
35 2         6 local $| = 1;
36 2         3 local $\;
37 2         74 print "$message $dispdef";
38              
39 2         5 my $answer;
40 2 50 33     27 if ($ENV{PERL_IOPT_USE_DEFAULT} || (!$isa_tty && eof STDIN)) {
      66        
41 2         162 print "$default_answer\n";
42             } else {
43 0   0     0 my $timeout = $opt{timeout} || $DEFAULT_TIMEOUT_SEC;
44 0         0 my $is = IO::Select->new;
45 0         0 $is->add(\*STDIN);
46 0 0       0 if (my @readable = $is->can_read($timeout)) {
47 0         0 my $stdin = shift @readable;
48 0         0 $answer = <$stdin>;
49             } else {
50 0         0 $HAS_TIMED_OUT = 1;
51             }
52              
53 0 0       0 if (defined $answer) {
54 0         0 chomp $answer;
55             } else {
56             # User hit ctrl-D
57             # Or timed out.
58 0         0 print "\n";
59             }
60             }
61              
62 2 50       9 $answer = defined $answer ? $answer : q{};
63 2   33     17 return $answer || $default_answer;
64             }
65              
66 1     1 1 11 sub has_prompt_timed_out { $HAS_TIMED_OUT; }
67              
68             sub _parse_args {
69 3     3   501 my %args = @_;
70             return (
71 3   100     21 default_answer => $args{default} || q{},
72             timeout => $args{timeout},
73             );
74             }
75              
76             1;
77             __END__