File Coverage

blib/lib/BZ/Client/XMLRPC/Value.pm
Criterion Covered Total %
statement 18 70 25.7
branch 0 34 0.0
condition 0 18 0.0
subroutine 6 12 50.0
pod 0 4 0.0
total 24 138 17.3


line stmt bran cond sub pod time code
1             #!/bin/false
2             # PODNAME: BZ::Client::XMLRPC::Value
3             # ABSTRACT: Event handler for parsing a single XML-RPC value.
4              
5 1     1   12 use strict;
  1         2  
  1         23  
6 1     1   5 use warnings 'all';
  1         2  
  1         46  
7              
8             package BZ::Client::XMLRPC::Value;
9             $BZ::Client::XMLRPC::Value::VERSION = '4.4002';
10 1     1   4 use parent qw( BZ::Client::XMLRPC::Handler );
  1         2  
  1         4  
11 1     1   377 use BZ::Client::XMLRPC::Struct;
  1         3  
  1         21  
12 1     1   309 use BZ::Client::XMLRPC::Array;
  1         2  
  1         19  
13 1     1   427 use DateTime::Format::ISO8601 ();
  1         554726  
  1         673  
14              
15             sub start {
16 0     0 0   my ( $self, $name ) = @_;
17 0           my $l = $self->inc_level();
18 0 0         if ( $l == 0 ) {
    0          
19 0 0         if ( 'value' ne $name ) {
20 0           $self->error("Expected value element, got $name");
21             }
22 0           $self->{'level0_content'} = q();
23             }
24             elsif ( $l == 1 ) {
25 0 0 0       if ( 'struct' eq $name ) {
    0 0        
    0 0        
      0        
      0        
      0        
26 0           my $handler = BZ::Client::XMLRPC::Struct->new();
27             $self->parser()->register(
28             $self, $handler,
29             sub {
30 0     0     $self->{'result'} = $handler->result();
31             }
32 0           );
33 0           $handler->start($name);
34             }
35             elsif ( 'array' eq $name ) {
36 0           my $handler = BZ::Client::XMLRPC::Array->new();
37             $self->parser()->register(
38             $self, $handler,
39             sub {
40 0     0     $self->{'result'} = $handler->result();
41             }
42 0           );
43 0           $handler->start($name);
44             }
45             elsif ('i4' eq $name
46             or 'int' eq $name
47             or 'string' eq $name
48             or 'double' eq $name
49             or 'dateTime.iso8601' eq $name
50             or 'base64' eq $name
51             or 'boolean' eq $name )
52             {
53 0           $self->{'level1_elem'} = $name;
54 0           $self->{'level1_content'} = q();
55             }
56             else {
57 0           $self->error(
58             "Expected struct|array|i4|int|boolean|string|double|dateTime.iso8601|base64 element, got $name"
59             );
60             }
61             }
62             else {
63 0           $self->error("Unexpected element $name at level $l");
64             }
65             }
66              
67             sub end {
68 0     0 0   my ( $self, $name ) = @_;
69 0           my $l = $self->level();
70 0 0         if ( $l == 1 ) {
    0          
71 0           my $content = $self->{'level0_content'};
72 0 0         if ( defined( $self->{'result'} ) ) {
73 0 0         if ( $content !~ m/^\s*$/s ) {
74 0           $self->error('Unexpected non-whitespace content');
75             }
76             }
77             else {
78 0           $self->{'result'} = $content;
79             }
80             }
81             elsif ( $l == 2 ) {
82 0           my $name = $name;
83 0 0         if ( defined($name) ) {
84 0           $self->{'result'} = $self->{'level1_content'};
85 0           $self->{'level1_content'} = undef;
86 0           $self->{'level1_elem'} = undef;
87 0 0         if ( 'dateTime.iso8601' eq $name ) {
88 0           my $val = $self->{'result'};
89 0 0         if ( $val =~ m/(\d\d\d\d)(\d\d)(\d\d)(T\d\d:\d\d:\d\d)/ )
90             { # See https://rt.cpan.org/Public/Bug/Display.html?id=78467
91 0           $val = "$1-$2-$3$4";
92             }
93 0           $self->{'result'} =
94             DateTime::Format::ISO8601->parse_datetime($val)->set_time_zone('UTC');
95             }
96             }
97             }
98 0           return $self->SUPER::end($name)
99             }
100              
101             sub characters {
102 0     0 0   my ( $self, $text ) = @_;
103 0           my $l = $self->level();
104 0 0         if ( $l == 1 ) {
    0          
105 0           $self->{'level0_content'} .= $text;
106             return
107 0           }
108             elsif ( $l == 2 ) {
109 0           my $l1_elem = $self->{'level1_elem'};
110 0 0         if ( defined($l1_elem) ) {
111 0           $self->{'level1_content'} .= $text;
112             return
113 0           }
114             }
115 0           $self->SUPER::characters($text);
116             }
117              
118             sub result {
119 0     0 0   my $self = shift;
120 0           my $res = $self->{'result'};
121 0 0         $res = defined($res) ? $res : q();
122 0           return $res
123             }
124              
125             1;
126              
127             __END__
128              
129             =pod
130              
131             =encoding UTF-8
132              
133             =head1 NAME
134              
135             BZ::Client::XMLRPC::Value - Event handler for parsing a single XML-RPC value.
136              
137             =head1 VERSION
138              
139             version 4.4002
140              
141             =head1 AUTHORS
142              
143             =over 4
144              
145             =item *
146              
147             Dean Hamstead <dean@bytefoundry.com.au>
148              
149             =item *
150              
151             Jochen Wiedmann <jochen.wiedmann@gmail.com>
152              
153             =back
154              
155             =head1 COPYRIGHT AND LICENSE
156              
157             This software is copyright (c) 2017 by Dean Hamstad.
158              
159             This is free software; you can redistribute it and/or modify it under
160             the same terms as the Perl 5 programming language system itself.
161              
162             =cut