1use std::time::Duration;
4
5use serde::{Deserialize, Serialize};
6use url::Url;
7
8pub const USER_AGENT: &str = "CodoSEObot/0.1 (+https://codoseo.com/bot)";
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(rename_all = "snake_case")]
14pub enum AddressPolicy {
15 Public,
16 AllowPrivate,
17}
18
19#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
20pub struct CrawlLimits {
21 pub max_pages: u32,
22 pub max_duration: Duration,
23 pub max_page_bytes: usize,
24 pub request_timeout: Duration,
25 pub max_redirects: u8,
26 pub max_sitemap_urls: u32,
27}
28
29impl Default for CrawlLimits {
30 fn default() -> Self {
31 CrawlLimits {
32 max_pages: 500,
33 max_duration: Duration::from_secs(600),
34 max_page_bytes: 5 * 1024 * 1024,
35 request_timeout: Duration::from_secs(30),
36 max_redirects: 10,
37 max_sitemap_urls: 50_000,
38 }
39 }
40}
41
42#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
43pub struct Politeness {
44 pub requests_per_sec: f32,
45 pub per_site_connections: u32,
46 pub max_crawl_delay: Duration,
47 pub max_in_flight: u32,
48 pub max_consecutive_failures: u32,
49}
50
51impl Default for Politeness {
52 fn default() -> Self {
53 Politeness {
54 requests_per_sec: 5.0,
55 per_site_connections: 2,
56 max_crawl_delay: Duration::from_secs(10),
57 max_in_flight: 64,
58 max_consecutive_failures: 20,
59 }
60 }
61}
62
63#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
64pub struct CrawlConfig {
65 pub start_url: Url,
66 pub limits: CrawlLimits,
67 pub politeness: Politeness,
68 pub address_policy: AddressPolicy,
69 pub user_agent: String,
70}
71
72#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
74pub struct RobotsFile {
75 pub status: u16,
76 pub body: String,
77 pub hash: u64,
78}
79
80#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
82pub struct SitemapSummary {
83 pub files: Vec<Url>,
84 pub url_count: u32,
85 pub hash: u64,
86 pub truncated: bool,
88 pub failed_files: u32,
90 pub complete: bool,
93}