use serde::{Serialize,Deserialize};
use crate::crawling::ExitCode;
use crate::time::UtcTimestamp;
use crate::url::UrlWithoutFragment;
#[derive(Clone,Debug,Serialize,Deserialize)]
pub struct CrawlCandidate {
pub url: UrlWithoutFragment,
pub last_crawl_time: Option<UtcTimestamp>,
pub last_crawl_exit_code: Option<ExitCode>,
pub last_contentful_crawl_time: Option<UtcTimestamp>,
pub last_contentful_http_etag: Option<String>,
}
#[derive(Clone,Debug,Serialize,Deserialize)]
pub enum CrawlCandidateUpdate {
ContentlessCrawl {
time: UtcTimestamp,
exit_code: Option<ExitCode>,
},
ContentfulCrawl {
time: UtcTimestamp,
exit_code: ExitCode,
http_etag: Option<String>,
},
}
impl CrawlCandidate {
pub fn new(url: UrlWithoutFragment) -> Self {
Self {
url: url,
last_crawl_time: None,
last_crawl_exit_code: None,
last_contentful_crawl_time: None,
last_contentful_http_etag: None,
}
}
pub fn apply_update(&mut self, update: CrawlCandidateUpdate) {
match update {
CrawlCandidateUpdate::ContentlessCrawl{time, exit_code} => {
self.last_crawl_time = Some(time);
self.last_crawl_exit_code = exit_code;
},
CrawlCandidateUpdate::ContentfulCrawl{time, exit_code, http_etag} => {
self.last_crawl_time = Some(time);
self.last_crawl_exit_code = Some(exit_code);
self.last_contentful_crawl_time = Some(time);
self.last_contentful_http_etag = http_etag;
},
}
}
}