File Coverage

blib/lib/Pegex/Input.pm
Criterion Covered Total %
statement 27 32 84.3
branch 11 20 55.0
condition 1 3 33.3
subroutine 4 4 100.0
pod 0 3 0.0
total 43 62 69.3


line stmt bran cond sub pod time code
1             package Pegex::Input;
2              
3 11     11   76 use Pegex::Base;
  11         16  
  11         47  
4              
5             has string => ();
6             has stringref => ();
7             has file => ();
8             has handle => ();
9             has _buffer => ();
10             has _is_eof => 0;
11             has _is_open => 0;
12             has _is_close => 0;
13              
14             # NOTE: Current implementation reads entire input into _buffer on open().
15             sub read {
16 19     19 0 38 my ($self) = @_;
17 19 50       41 die "Attempted Pegex::Input::read before open" if not $self->{_is_open};
18 19 50       43 die "Attempted Pegex::Input::read after EOF" if $self->{_is_eof};
19              
20 19         26 my $buffer = $self->{_buffer};
21 19         29 $self->{_buffer} = undef;
22 19         29 $self->{_is_eof} = 1;
23              
24 19         40 return $buffer;
25             }
26              
27             sub open {
28 19     19 0 46 my ($self) = @_;
29             die "Attempted to reopen Pegex::Input object"
30 19 50 33     91 if $self->{_is_open} or $self->{_is_close};
31              
32 19 50       92 if (my $ref = $self->{stringref}) {
    50          
    100          
    50          
33 0         0 $self->{_buffer} = $ref;
34             }
35             elsif (my $handle = $self->{handle}) {
36 0         0 $self->{_buffer} = \ do { local $/; <$handle> };
  0         0  
  0         0  
37             }
38             elsif (my $path = $self->{file}) {
39 1 50       40 open my $handle, "<", $path
40             or die "Pegex::Input can't open $path for input:\n$!";
41 1         3 $self->{_buffer} = \ do { local $/; <$handle> };
  1         5  
  1         43  
42             }
43             elsif (exists $self->{string}) {
44 18         71 $self->{_buffer} = \$self->{string};
45             }
46             else {
47 0         0 die "Pegex::Input::open failed. No source to open";
48             }
49 19         34 $self->{_is_open} = 1;
50 19         39 return $self;
51             }
52              
53             sub close {
54 19     19 0 37 my ($self) = @_;
55             die "Attempted to close an unopen Pegex::Input object"
56 19 50       51 if $self->{_is_close};
57 19 50       51 close $self->{handle} if $self->{handle};
58 19         33 $self->{_is_open} = 0;
59 19         39 $self->{_is_close} = 1;
60 19         34 $self->{_buffer} = undef;
61 19         49 return $self;
62             }
63              
64             1;