pub mod memory;
#[cfg(feature = "persistence")]
pub mod file;
#[cfg(feature = "redis-frontier")]
pub mod redis_frontier;
pub use memory::MemoryFrontier;
#[cfg(feature = "persistence")]
pub use file::FileFrontier;
#[cfg(feature = "redis-frontier")]
pub use redis_frontier::RedisFrontier;
use crate::error::KumoError;
use crate::request::{CrawlRequest, FrontierRequest};
#[async_trait::async_trait]
pub trait Frontier: Send + Sync {
async fn push(&self, url: String, depth: usize) -> bool;
async fn push_force(&self, url: String, depth: usize, retry_count: u32);
async fn pop(&self) -> Option<(String, usize, u32)>;
async fn push_request(&self, request: CrawlRequest, depth: usize) -> bool {
self.push(request.url().to_string(), depth).await
}
async fn push_request_force(&self, queued: FrontierRequest) {
self.push_force(
queued.request.url().to_string(),
queued.depth,
queued.retry_count,
)
.await;
}
async fn pop_request(&self) -> Option<FrontierRequest> {
self.pop().await.map(|(url, depth, retry_count)| {
FrontierRequest::new(CrawlRequest::get(url), depth, retry_count)
})
}
async fn len(&self) -> usize;
async fn is_empty(&self) -> bool {
self.len().await == 0
}
async fn flush(&self) -> Result<(), KumoError> {
Ok(())
}
}