File Coverage

blib/lib/JSON/RPC/Spec/Procedure.pm
Criterion Covered Total %
statement 55 56 98.2
branch 18 18 100.0
condition 10 10 100.0
subroutine 9 9 100.0
pod 1 1 100.0
total 93 94 98.9


line stmt bran cond sub pod time code
1             package JSON::RPC::Spec::Procedure;
2 9     9   113141 use Moo;
  9         6258  
  9         90  
3 9     9   4555 use Carp ();
  9         18  
  9         289  
4 9     9   72 use Try::Tiny;
  9         29  
  9         1006  
5             with qw(
6             JSON::RPC::Spec::Common
7             );
8              
9 9   100 9   63 use constant DEBUG => $ENV{PERL_JSON_RPC_SPEC_DEBUG} || 0;
  9         17  
  9         1788  
10              
11             has router => (
12             is => 'ro',
13             required => 1,
14             isa => sub {
15             my $self = shift;
16             $self->can('match') or Carp::croak('method match required.');
17             },
18             );
19              
20 9     9   4965 use namespace::clean;
  9         167463  
  9         65  
21              
22             sub parse {
23 57     57 1 5469 my ($self, $obj, $extra_args) = @_;
24 57 100       227 if (ref $obj ne 'HASH') {
25 4         16 return $self->_rpc_invalid_request;
26             }
27 53         207 $self->_is_notification(!exists $obj->{id});
28 53 100 100     282 if (defined $obj->{id} and ref $obj->{id} ne '') {
29 3         13 $self->_id(undef);
30 3         20 return $self->_rpc_invalid_request;
31             }
32 50         170 $self->_id($obj->{id});
33 50   100     151 my $method = $obj->{method} || '';
34              
35             # rpc call with invalid Request object:
36             # rpc call with an invalid Batch (but not empty):
37             # rpc call with invalid Batch:
38 50 100 100     354 if ($method eq '' or $method =~ m!\A\.|\A[0-9]+\z!) {
39 9         47 return $self->_rpc_invalid_request;
40             }
41 41         810 my $jsonrpc_version = $self->_jsonrpc;
42 41 100       320 $obj->{jsonrpc} ne $jsonrpc_version
43             and return $self->_rpc_invalid_request(
44             qq{Invalid Request: jsonrpc must be '$jsonrpc_version'});
45              
46 39         65 my ($result, $err);
47             try {
48 39     39   1450 $result = $self->_trigger($method, $obj->{params}, $extra_args);
49             }
50             catch {
51 14     14   263 $err = $_;
52 14         50 warn qq{-- error : @{[ $err ]} } if DEBUG;
  39         10606  
53 39         369 };
54 8 100       25 if ($self->_is_notification) {
55 31         75 return;
56             }
57 10 100       21 if ($err) {
58 10         94 my $error;
59 4 100       35 if ($err =~ m!rpc_method_not_found!) {
    100          
60 4         18 $err =~ s!\sat\s.*?\n\z!!;
61 4         55 $err =~ s!rpc_method_not_found!Method not found!;
62 2         21 $error = $self->_rpc_method_not_found($err);
63             }
64             elsif ($err =~ m!rpc_invalid_params!) {
65 2         11 $err =~ s!\sat\s.*?\n\z!!;
66 2         15 $err =~ s!rpc_invalid_params!Invalid params!;
67 4         14 $error = $self->_rpc_invalid_params($err);
68             }
69             else {
70 10         136 $error = $self->_rpc_internal_error(data => $err);
71             }
72 21         471 return $error;
73             }
74             return +{
75 0         0 jsonrpc => $self->_jsonrpc,
76             result => $result,
77             id => $self->_id
78             };
79             }
80              
81             # trigger registered method
82             sub _trigger {
83 40     40   4673 my ($self, $name, $params, $extra_args) = @_;
84 40         112 my $router = $self->router;
85 40         171 my $matched = $router->match($name);
86              
87             # rpc call of non-existent method:
88 40 100       2720 unless ($matched) {
89 6         1310 Carp::croak 'rpc_method_not_found';
90             }
91 34         911 my $cb = delete $matched->{$self->_callback_key};
92 34         312 return $cb->($params, $matched, @{$extra_args});
  34         161  
93             }
94              
95             1;
96             __END__