File Coverage

blib/lib/DDG/Meta/RequestHandler.pm
Criterion Covered Total %
statement 91 106 85.8
branch 28 44 63.6
condition 2 3 66.6
subroutine 19 20 95.0
pod 3 3 100.0
total 143 176 81.2


line stmt bran cond sub pod time code
1             package DDG::Meta::RequestHandler;
2             our $AUTHORITY = 'cpan:DDG';
3             # ABSTRACT: Functions for a request handler
4             $DDG::Meta::RequestHandler::VERSION = '1018';
5 11     18   84 use strict;
  11         31  
  11         343  
6 11     11   70 use warnings;
  11         28  
  11         307  
7 11     11   75 use Carp;
  11         34  
  11         651  
8 11     11   785 use Package::Stash;
  11         17095  
  11         350  
9 11     11   1554 use DDG::Location;
  11         38  
  11         397  
10 11     11   1980 use DDG::Language;
  11         35  
  11         12222  
11             require Moo::Role;
12              
13              
14             my @request_scalar_attributes = qw(
15              
16             query_raw
17             query_nowhitespace
18             query_nowhitespace_nodash
19             query
20             query_lc
21             query_clean
22             wordcount
23              
24             );
25              
26             my @request_array_attributes = qw(
27              
28             words
29             query_parts
30             query_raw_parts
31              
32             );
33              
34             my $default_handler = 'query_raw';
35              
36              
37             my %applied;
38              
39             sub apply_keywords {
40 35     35 1 146 my ( $class, $target, $result_handler, $role ) = @_;
41              
42 35 50       142 return if exists $applied{$target};
43 35         89 $applied{$target} = undef;
44            
45 35         238 my $stash = Package::Stash->new($target);
46              
47 35         157 $class->reset_request_symbols($stash);
48              
49              
50             $stash->add_symbol('&handle',sub {
51 27     27   192 my $handler = shift;
        17      
        3      
52 27         55 my $code;
53 27 100       116 if (ref $handler eq 'CODE') {
54 6         15 $code = $handler;
55 6         18 $handler = $default_handler;
56             } else {
57 21         39 $code = shift;
58 21 50       80 croak "We need a CODEREF for the handler" unless ref $code eq 'CODE';
59             }
60 27 100       107 croak "Please define triggers before you define a handler" unless $target->has_triggers;
61              
62 26 100 66     72 if (grep { $_ eq $handler } @request_scalar_attributes) {
  182 100       383  
    50          
    100          
    50          
    0          
63             $stash->add_symbol('&handle_request_matches',sub {
64 10     10   37 my ( $self, $request ) = @_;
        7      
        5      
65 10         88 $class->request_symbols($stash,$request);
66 10         27 my @result;
67 10         58 my $default = $request->$handler;
68 10         36 for ($default) {
69 10         49 @result = $code->($_);
70             }
71 10         133 $class->reset_request_symbols($stash);
72 10 50       91 return @result ? $result_handler->($self,@result) : ();
73 7         94 });
74 57         202 } elsif (grep { $_ eq $handler } @request_array_attributes) {
75             $stash->add_symbol('&handle_request_matches',sub {
76 7     7   19 my ( $self, $request ) = @_;
77 7         29 $class->request_symbols($stash,$request);
78 7         16 my @result;
79 7         22 my $default = $request->$default_handler;
80 7         15 for ($default) {
81 7         13 @result = $code->(@{$request->$handler});
  7         106  
82             }
83 7         61 $class->reset_request_symbols($stash);
84 7 50       37 return @result ? $result_handler->($self,@result) : ();
85 3         37 });
86             # LEGACY vvvv (got replaced with $req feature)
87             } elsif ($handler eq 'request') {
88             $stash->add_symbol('&handle_request_matches',sub {
89 0     0   0 my ( $self, $request ) = @_;
90 0         0 $class->request_symbols($stash,$request);
91 0         0 my @result;
92 0         0 for ($request) {
93 0         0 @result = $code->($_);
94             }
95 0         0 $class->reset_request_symbols($stash);
96 0 0       0 return @result ? $result_handler->($self,@result) : ();
97 0         0 });
98             # ^^^^
99             } elsif ($handler eq 'remainder' || $handler eq 'remainder_lc') {
100 11 100       46 croak "You must be using words matching for remainder handler" unless $target->triggers_block_type eq 'Words';
101             $stash->add_symbol('&handle_request_matches',sub {
102 24     24   78 my ( $self, $request, $from_pos, $to_pos ) = @_;
103 24         119 $class->request_symbols($stash,$request);
104 24         121 my $remainder = $request->generate_remainder($from_pos,$to_pos);
105 24         49 my @result;
106 24 50       122 for ($handler eq 'remainder' ? $remainder : lc($remainder)) {
107 24         103 @result = $code->($_);
108             }
109 24         173 $class->reset_request_symbols($stash);
110 24 50       125 return @result ? $result_handler->($self, @result) : ();
111 10         175 });
112             } elsif ($handler eq 'matches') {
113 5 100       19 croak "You must be using regexps matching for matches handler" unless $target->triggers_block_type eq 'Regexp';
114             $stash->add_symbol('&handle_request_matches',sub {
115 4     4   12 my ( $self, $request, @matches ) = @_;
116 4         17 $class->request_symbols($stash,$request);
117 4         9 my @result;
118 4         11 my $default = $request->query_raw;
119 4         122 for ($default) {
120 4         17 @result = $code->(@matches);
121             }
122 4         43 $class->reset_request_symbols($stash);
123 4 50       21 return @result ? $result_handler->($self,@result) : ();
124 4         47 });
125             } elsif ($handler eq 'all') {
126             $stash->add_symbol('&handle_request_matches',sub {
127 0     4   0 my ( $self, $request, @matches_or_pos ) = @_;
128 0         0 $class->request_symbols($stash,$request);
129 0         0 my @result = $code->($self,$request,\@matches_or_pos);
130 0         0 $class->reset_request_symbols($stash);
131 0 0       0 return @result ? $result_handler->($self,@result) : ();
132 0         0 });
133             } else {
134 0         0 croak "I dont know how to handle ".$handler."!";
135             }
136              
137             #
138             # apply role
139             #
140              
141 24 50       176 Moo::Role->apply_role_to_package($target,$role) if $role;
142 35         3264 });
143             }
144              
145              
146             sub request_symbols {
147 45     45 1 111 my ( $class, $stash, $request ) = @_;
148 45         418 $stash->add_symbol('$req',\$request);
149              
150 45         306 $stash->add_symbol('$has_loc',$request->has_location);
151 45 100       145 if ($request->has_location) {
152 17         97 $stash->add_symbol('$loc',\$request->location);
153             } else {
154 28         501 $stash->add_symbol('$loc',\DDG::Location->new);
155             }
156              
157 45         295 $stash->add_symbol('$has_lang',$request->has_language);
158 45 100       175 if ($request->has_language) {
159 16         86 $stash->add_symbol('$lang',\$request->language);
160             } else {
161 29         500 $stash->add_symbol('$lang',\DDG::Language->new);
162             }
163              
164             # $stash->add_symbol('$has_reg',$request->has_region);
165             # if ($request->has_region) {
166             # $stash->add_symbol('$reg',\$request->region);
167             # } else {
168             # $stash->add_symbol('$reg','');
169             # }
170              
171             }
172              
173              
174             sub reset_request_symbols {
175 80     80 1 236 my ( $class, $stash ) = @_;
176 80         546 $stash->add_symbol('$req',undef);
177              
178 80         410 $stash->add_symbol('$has_loc',undef);
179 80         441 $stash->add_symbol('$loc',undef);
180              
181 80         408 $stash->add_symbol('$has_lang',undef);
182 80         432 $stash->add_symbol('$lang',undef);
183              
184             # $stash->add_symbol('$has_reg',undef);
185             # $stash->add_symbol('$reg',undef);
186             }
187              
188             1;
189              
190             __END__