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   115418 use Moo;
  5         5565  
  5         26  
4 5     5   2343 use Carp qw( croak );
  5         6  
  5         2280  
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 314 my ( $self ) = @_;
40 44 100       49 croak "WWW::Crawl4AI::Request needs at least one url" unless @{ $self->urls };
  44         277  
41 43         175 return;
42             }
43              
44             sub _default_browser_params {
45 23     23   31 return { headless => JSON_true() };
46             }
47              
48             sub _default_crawler_params {
49 23     23   34 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 5597 sub JSON_true { $TRUE ||= do { require JSON::MaybeXS; JSON::MaybeXS::true() } }
  3         18  
  3         77  
57 23   33 23 1 35 sub JSON_false { $FALSE ||= do { require JSON::MaybeXS; JSON::MaybeXS::false() } }
  23         174  
  23         60  
58              
59              
60             sub to_crawl_payload {
61 23     23 1 129 my ( $self ) = @_;
62 23         24 my %browser = ( %{ $self->_default_browser_params }, %{ $self->browser_params } );
  23         34  
  23         196  
63 23         43 my %crawler = ( %{ $self->_default_crawler_params }, %{ $self->crawler_params } );
  23         38  
  23         148  
64             return {
65 23         139 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 6 my ( $self ) = @_;
74 1         6 my %p = ( url => $self->urls->[0] );
75 1 50       8 $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         7 return \%p;
79             }
80              
81              
82             1;
83              
84             __END__