use async_std::task;
use async_trait::async_trait;
use medina::{Crawler, CrawlerRunner, Error, Page, PageResult};
const ITEMS_PER_HOST: usize = 50;
pub struct FakePage {
pub url: String,
}
#[async_trait]
impl Page for FakePage {
async fn process_request(
&self,
) -> Result<(Vec<Box<dyn Page>>, Vec<Box<dyn PageResult>>), Error> {
let mut vec = Vec::<Box<dyn Page>>::new();
vec.reserve_exact(ITEMS_PER_HOST);
let ch = self.url.as_bytes()[8];
if ch >= b'a' && ch <= b'y' {
for i in 1..ITEMS_PER_HOST + 1 {
vec.push(Box::new(FakePage {
url: format!("https://{}.com/{}", (ch + 1) as char, i),
}));
}
}
return Ok((vec, Vec::new()));
}
fn get_url<'a>(&'a self) -> &'a String {
return &self.url;
}
}
fn main() {
task::block_on(async {
let mut crawler = Crawler::new();
crawler.push_item(Box::new(FakePage {
url: "https://a.com".to_string(),
}));
CrawlerRunner::run(crawler, 50, 30).await;
})
}