File Coverage

blib/lib/Regru/API/Response.pm
Criterion Covered Total %
statement 39 39 100.0
branch 14 16 87.5
condition 4 9 44.4
subroutine 10 10 100.0
pod 1 1 100.0
total 68 75 90.6


line stmt bran cond sub pod time code
1             package Regru::API::Response;
2              
3             # ABSTRACT: REG.API v2 response wrapper
4              
5 13     13   101618 use strict;
  13         34  
  13         405  
6 13     13   64 use warnings;
  13         27  
  13         277  
7 13     13   613 use Moo;
  13         11316  
  13         70  
8 13     13   5747 use Try::Tiny;
  13         1316  
  13         912  
9 13     13   91 use Carp;
  13         36  
  13         770  
10 13     13   951 use namespace::autoclean;
  13         21066  
  13         101  
11              
12             our $VERSION = '0.051'; # VERSION
13             our $AUTHORITY = 'cpan:CHIM'; # AUTHORITY
14              
15             with qw(
16             Regru::API::Role::Serializer
17             Regru::API::Role::Loggable
18             );
19              
20             has error_code => ( is => 'rw' );
21             has error_text => ( is => 'rw' );
22             has error_params => ( is => 'rw' );
23             has is_success => ( is => 'rw' );
24             has is_service_fail => ( is => 'rw' );
25              
26             has answer => (
27             is => 'rw',
28             default => sub { +{} }
29             );
30              
31             has response => (
32             is => 'rw',
33             trigger => 1,
34             );
35              
36             has debug => (
37             is => 'rw',
38             default => sub { 0 }
39             );
40              
41             sub _trigger_response {
42 8     8   10497 my ($self, $response) = @_;
43              
44 8 50       24 if ($response) {
45             try {
46 8 100   8   389 die 'Invalid response' unless ref $response eq 'HTTP::Response';
47              
48 7 100       31 $self->debug_warn('REG.API response code', $response->code) if $self->debug;
49              
50 7 100       103 $self->is_service_fail($response->code == 200 ? 0 : 1);
51              
52 7 100       98 if ($self->is_service_fail) {
53             # Stop processing response
54 3         8 $self->is_success(0);
55 3   33     7 die 'Service failed: ' . ($response->decoded_content || $response->content);
56             }
57              
58 4   33     97 my $decoded = $self->serializer->decode($response->decoded_content || $response->content);
59 2   66     486 $self->is_success($decoded->{result} && $decoded->{result} eq 'success');
60              
61 2 50       14 $self->debug_warn('REG.API request', ($self->is_success ? 'success' : 'fail')) if $self->debug;
    100          
62 2 100       52 if ($self->is_success) {
63 1         20 $self->answer($decoded->{answer});
64             }
65             else {
66 1         3 foreach my $attr (qw/error_code error_text error_params/) {
67 3         16 $self->$attr($decoded->{$attr});
68             }
69             }
70             }
71             catch {
72 6     6   1430 carp 'Error: ' . $_;
73 6         276 $self->error_code('API_FAIL');
74 6         37 $self->error_text('API response error');
75 8         64 };
76             }
77             }
78              
79             sub get {
80 2     2 1 2775 my ($self, $attr) = @_;
81              
82 2         15 return $self->answer->{$attr};
83             }
84              
85             1; # End of Regru::API::Response
86              
87             __END__
88              
89             =pod
90              
91             =encoding UTF-8
92              
93             =head1 NAME
94              
95             Regru::API::Response - REG.API v2 response wrapper
96              
97             =head1 VERSION
98              
99             version 0.051
100              
101             =head1 SYNOPSIS
102              
103             my $resp = Regru::API::Response->new(
104             response => $response,
105             );
106              
107             =head1 ATTRIBUTES
108              
109             =head2 is_service_fail
110              
111             Flag to show whether or not the most last answer from the API service has not been finished with code I<HTTP 200>.
112              
113             $resp = $client->bill->nop(bill_id => 123213);
114              
115             if ($resp->is_success) {
116             print "It works!";
117             }
118             elsif ($resp->is_service_fail) {
119             print "Reg.ru API is gone :(";
120             }
121             else {
122             print "Error code: ". $resp->error_code;
123             }
124              
125             =head2 is_success
126              
127             Flag to show whether or not the most last API request has been successful.
128              
129             See example for L</is_service_fail>.
130              
131             =head2 response
132              
133             Contains a L<HTTP::Response> object for the most last API request.
134              
135             if ($resp->is_service_fail) {
136             print "HTTP code: " . $resp->response->code;
137             }
138              
139             =head2 answer
140              
141             Contains decoded answer for the most last successful API request.
142              
143             if ($resp->is_success) {
144             print Dumper($resp->answer);
145             }
146              
147             This is useful for debugging;
148              
149             =head2 error_code
150              
151             Contains error code for the most last API request if it has not been successful.
152              
153             Full list error codes list is available at
154             L<REG.API Common error codes|https://www.reg.com/support/help/api2#common_errors>.
155              
156             =head2 error_text
157              
158             Contains common error text for the most last API request if it has not been successful.
159              
160             Default language is B<enlish>. Language can be changed by passing option C<lang> to the
161             L<Regru::API> constructor.
162              
163             =head2 error_params
164              
165             Contains additional parameters included into the common error text.
166              
167             $error_params = $resp->error_params;
168             print "Details: " . $error_params->{error_detail};
169              
170             =head2 debug
171              
172             A few messages will be printed to STDERR. Default value is B<0> (suppressed debug activity).
173              
174             =head1 METHODS
175              
176             =head2 new
177              
178             Creates a response object from REG.API response. Available options:
179              
180             =over
181              
182             =item B<response>
183              
184             Required. This should be a result of HTTP request to REG.API. In general, is a L<HTTP::Response> object returned by
185             L<LWP::UserAgent>.
186              
187             =item B<debug>
188              
189             Not required. Print some debugging messages to STDERR. Default value is B<0>. Because of this contructor invoked from
190             L<Regru::API::Role::Client> mainly so this option sets to the value which passed to L<Regru::API> constructor.
191              
192             =back
193              
194             =head2 get
195              
196             Gets a value from stored in answer.
197              
198             $resp = $client->user->get_statistics;
199             print "Account balance: " . $resp->get("balance_total");
200              
201             =head1 SEE ALSO
202              
203             L<Regru::API>
204              
205             L<Regru::API::Role::Client>
206              
207             L<Regru::API::Role::Serializer>
208              
209             L<Regru::API::Role::Loggable>
210              
211             L<HTTP::Response>
212              
213             L<LWP::UserAgent>
214              
215             L<REG.API Common error codes|https://www.reg.com/support/help/api2#common_errors>
216              
217             =head1 BUGS
218              
219             Please report any bugs or feature requests on the bugtracker website
220             L<https://github.com/regru/regru-api-perl/issues>
221              
222             When submitting a bug or request, please include a test-file or a
223             patch to an existing test-file that illustrates the bug or desired
224             feature.
225              
226             =head1 AUTHORS
227              
228             =over 4
229              
230             =item *
231              
232             Polina Shubina <shubina@reg.ru>
233              
234             =item *
235              
236             Anton Gerasimov <a.gerasimov@reg.ru>
237              
238             =back
239              
240             =head1 COPYRIGHT AND LICENSE
241              
242             This software is copyright (c) 2013 by REG.RU LLC.
243              
244             This is free software; you can redistribute it and/or modify it under
245             the same terms as the Perl 5 programming language system itself.
246              
247             =cut