You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

33 lines
954 B
Rust

use crate::error::XKCDResult;
use scraper::{Html, Selector};
use std::collections::HashMap;
use std::iter::FromIterator;
static ARCHIVE_URL: &str = "https://xkcd.com/archive/";
/// Returns the xkcd archive list
pub async fn get_archive() -> XKCDResult<HashMap<String, u32>> {
let response = reqwest::get(ARCHIVE_URL).await?;
let html = response.text().await?;
parse_archive_list(html)
}
fn parse_archive_list(html: String) -> XKCDResult<HashMap<String, u32>> {
let document = Html::parse_document(&html);
let archive_selector = Selector::parse(r#"#middleContainer > a"#).unwrap();
let archive = HashMap::from_iter(document.select(&archive_selector).filter_map(|element| {
Some((
element.inner_html(),
element
.value()
.attr("href")?
.replace("/", "")
.parse::<u32>()
.ok()?,
))
}));
Ok(archive)
}