File Coverage

inc/Pegex/Input.pm
Criterion Covered Total %
statement 23 32 71.8
branch 9 20 45.0
condition 1 3 33.3
subroutine 4 4 100.0
pod 0 3 0.0
total 37 62 59.6


line stmt bran cond sub pod time code
1             package Pegex::Input;
2              
3 1     1   5 use Pegex::Base;
  1         2  
  1         7  
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 14     14 0 16 my ($self) = @_;
17 14 50       34 die "Attempted Pegex::Input::read before open" if not $self->{_is_open};
18 14 50       41 die "Attempted Pegex::Input::read after EOF" if $self->{_is_eof};
19              
20 14         24 my $buffer = $self->{_buffer};
21 14         18 $self->{_buffer} = undef;
22 14         17 $self->{_is_eof} = 1;
23              
24 14         40 return $buffer;
25             }
26              
27             sub open {
28 14     14 0 22 my ($self) = @_;
29 14 50 33     75 die "Attempted to reopen Pegex::Input object"
30             if $self->{_is_open} or $self->{_is_close};
31              
32 14 50       93 if (my $ref = $self->{stringref}) {
    50          
    50          
    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 0 0       0 open my $handle, $path
40             or die "Pegex::Input can't open $path for input:\n$!";
41 0         0 $self->{_buffer} = \ do { local $/; <$handle> };
  0         0  
  0         0  
42             }
43             elsif (exists $self->{string}) {
44 14         30 $self->{_buffer} = \$self->{string};
45             }
46             else {
47 0         0 die "Pegex::Input::open failed. No source to open";
48             }
49 14         21 $self->{_is_open} = 1;
50 14         24 return $self;
51             }
52              
53             sub close {
54 14     14 0 17 my ($self) = @_;
55 14 50       38 die "Attempted to close an unopen Pegex::Input object"
56             if $self->{_is_close};
57 14 50       29 close $self->{handle} if $self->{handle};
58 14         20 $self->{_is_open} = 0;
59 14         20 $self->{_is_close} = 1;
60 14         20 $self->{_buffer} = undef;
61 14         33 return $self;
62             }
63              
64             1;