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 17 19 89.4
pod 3 3 100.0
total 141 175 80.5


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 = '1016';
5 11     11   70 use strict;
  11         11  
  11         234  
6 11     11   32 use warnings;
  11         11  
  11         182  
7 11     11   45 use Carp;
  11         19  
  11         406  
8 11     11   755 use Package::Stash;
  11         13608  
  11         195  
9 11     11   1313 use DDG::Location;
  11         19  
  11         236  
10 11     11   1435 use DDG::Language;
  11         14  
  11         8855  
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 60 my ( $class, $target, $result_handler, $role ) = @_;
41              
42 35 50       92 return if exists $applied{$target};
43 35         50 $applied{$target} = undef;
44            
45 35         151 my $stash = Package::Stash->new($target);
46              
47 35         90 $class->reset_request_symbols($stash);
48              
49              
50             $stash->add_symbol('&handle',sub {
51 27     27   128 my $handler = shift;
        13      
52 27         27 my $code;
53 27 100       46 if (ref $handler eq 'CODE') {
54 6         8 $code = $handler;
55 6         8 $handler = $default_handler;
56             } else {
57 21         20 $code = shift;
58 21 50       47 croak "We need a CODEREF for the handler" unless ref $code eq 'CODE';
59             }
60 27 100       67 croak "Please define triggers before you define a handler" unless $target->has_triggers;
61              
62 26 100 66     38 if (grep { $_ eq $handler } @request_scalar_attributes) {
  182 100       198  
    50          
    100          
    50          
    0          
63             $stash->add_symbol('&handle_request_matches',sub {
64 10     10   15 my ( $self, $request ) = @_;
        7      
        3      
65 10         43 $class->request_symbols($stash,$request);
66 10         13 my @result;
67 10         39 my $default = $request->$handler;
68 10         18 for ($default) {
69 10         27 @result = $code->($_);
70             }
71 10         71 $class->reset_request_symbols($stash);
72 10 50       48 return @result ? $result_handler->($self,@result) : ();
73 7         63 });
74 57         130 } elsif (grep { $_ eq $handler } @request_array_attributes) {
75             $stash->add_symbol('&handle_request_matches',sub {
76 7     7   9 my ( $self, $request ) = @_;
77 7         16 $class->request_symbols($stash,$request);
78 7         8 my @result;
79 7         13 my $default = $request->$default_handler;
80 7         10 for ($default) {
81 7         16 @result = $code->(@{$request->$handler});
  7         97  
82             }
83 7         37 $class->reset_request_symbols($stash);
84 7 50       23 return @result ? $result_handler->($self,@result) : ();
85 3         27 });
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       24 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   25 my ( $self, $request, $from_pos, $to_pos ) = @_;
103 24         47 $class->request_symbols($stash,$request);
104 24         60 my $remainder = $request->generate_remainder($from_pos,$to_pos);
105 24         23 my @result;
106 24 50       50 for ($handler eq 'remainder' ? $remainder : lc($remainder)) {
107 24         66 @result = $code->($_);
108             }
109 24         88 $class->reset_request_symbols($stash);
110 24 50       73 return @result ? $result_handler->($self, @result) : ();
111 10         91 });
112             } elsif ($handler eq 'matches') {
113 5 100       14 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   7 my ( $self, $request, @matches ) = @_;
116 4         11 $class->request_symbols($stash,$request);
117 4         6 my @result;
118 4         7 my $default = $request->query_raw;
119 4         11 for ($default) {
120 4         12 @result = $code->(@matches);
121             }
122 4         30 $class->reset_request_symbols($stash);
123 4 50       19 return @result ? $result_handler->($self,@result) : ();
124 4         39 });
125             } elsif ($handler eq 'all') {
126             $stash->add_symbol('&handle_request_matches',sub {
127 0     0   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       103 Moo::Role->apply_role_to_package($target,$role) if $role;
142 35         2754 });
143             }
144              
145              
146             sub request_symbols {
147 45     45 1 43 my ( $class, $stash, $request ) = @_;
148 45         255 $stash->add_symbol('$req',\$request);
149              
150 45         161 $stash->add_symbol('$has_loc',$request->has_location);
151 45 100       78 if ($request->has_location) {
152 17         57 $stash->add_symbol('$loc',\$request->location);
153             } else {
154 28         358 $stash->add_symbol('$loc',\DDG::Location->new);
155             }
156              
157 45         151 $stash->add_symbol('$has_lang',$request->has_language);
158 45 100       89 if ($request->has_language) {
159 16         54 $stash->add_symbol('$lang',\$request->language);
160             } else {
161 29         349 $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 88 my ( $class, $stash ) = @_;
176 80         352 $stash->add_symbol('$req',undef);
177              
178 80         226 $stash->add_symbol('$has_loc',undef);
179 80         322 $stash->add_symbol('$loc',undef);
180              
181 80         215 $stash->add_symbol('$has_lang',undef);
182 80         265 $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__