File Coverage

blib/lib/WWW/Crawl4AI/Request.pm
Criterion Covered Total %
statement 32 32 100.0
branch 5 8 62.5
condition 3 6 50.0
subroutine 9 9 100.0
pod 4 5 80.0
total 53 60 88.3


line stmt bran cond sub pod time code
1             package WWW::Crawl4AI::Request;
2             # ABSTRACT: builds Crawl4AI /crawl and /md request payloads
3 5     5   125880 use Moo;
  5         5814  
  5         33  
4 5     5   2671 use Carp qw( croak );
  5         7  
  5         2570  
5              
6             our $VERSION = '0.001';
7              
8              
9             has urls => (
10             is => 'ro',
11             required => 1,
12             coerce => sub { ref $_[0] eq 'ARRAY' ? $_[0] : [ $_[0] ] },
13             );
14              
15              
16             has browser_params => (
17             is => 'ro',
18             default => sub { {} },
19             );
20              
21              
22             has crawler_params => (
23             is => 'ro',
24             default => sub { {} },
25             );
26              
27              
28             # /md endpoint extras
29             has filter => ( is => 'ro' ); # fit | raw | bm25 | llm
30              
31              
32             has query => ( is => 'ro' );
33              
34              
35             has cache => ( is => 'ro' );
36              
37              
38             sub BUILD {
39 44     44 0 307 my ( $self ) = @_;
40 44 100       41 croak "WWW::Crawl4AI::Request needs at least one url" unless @{ $self->urls };
  44         252  
41 43         166 return;
42             }
43              
44             sub _default_browser_params {
45 23     23   52 return { headless => JSON_true() };
46             }
47              
48             sub _default_crawler_params {
49 23     23   67 return { stream => JSON_false(), cache_mode => 'bypass' };
50             }
51              
52             # We avoid a hard JSON::PP::Boolean dependency at build time by deferring to
53             # JSON::MaybeXS only where booleans are actually serialized. These helpers keep
54             # the payload hash JSON-true/false rather than 1/0 (Crawl4AI is strict).
55             my ( $TRUE, $FALSE );
56 61   66 61 1 5657 sub JSON_true { $TRUE ||= do { require JSON::MaybeXS; JSON::MaybeXS::true() } }
  3         18  
  3         73  
57 23   33 23 1 43 sub JSON_false { $FALSE ||= do { require JSON::MaybeXS; JSON::MaybeXS::false() } }
  23         163  
  23         44  
58              
59              
60             sub to_crawl_payload {
61 23     23 1 147 my ( $self ) = @_;
62 23         27 my %browser = ( %{ $self->_default_browser_params }, %{ $self->browser_params } );
  23         37  
  23         200  
63 23         43 my %crawler = ( %{ $self->_default_crawler_params }, %{ $self->crawler_params } );
  23         38  
  23         155  
64             return {
65 23         177 urls => $self->urls,
66             browser_config => { type => 'BrowserConfig', params => \%browser },
67             crawler_config => { type => 'CrawlerRunConfig', params => \%crawler },
68             };
69             }
70              
71              
72             sub to_md_payload {
73 1     1 1 5 my ( $self ) = @_;
74 1         4 my %p = ( url => $self->urls->[0] );
75 1 50       6 $p{f} = $self->filter if defined $self->filter;
76 1 50       4 $p{q} = $self->query if defined $self->query;
77 1 50       3 $p{c} = $self->cache if defined $self->cache;
78 1         6 return \%p;
79             }
80              
81              
82             1;
83              
84             __END__