1use crate::Client;
2use color_eyre::Result;
3use scraper::{Html, Selector};
4use std::collections::HashMap;
5
6pub struct Course {
7 pub title: String,
8 pub id: String,
9}
10
11impl Client {
12 pub async fn get_courses(&self) -> Result<Vec<Course>> {
13 let request = self.request(reqwest::Method::GET, "home_course");
14
15 let response = request.send().await?;
16 let body = response.text().await?;
17
18 let document = Html::parse_document(&body);
19
20 let selector = Selector::parse("a[href^='course_']").unwrap();
21 let course_elements = document.select(&selector);
22
23 let mut all_courses = HashMap::new();
24 for course_element in course_elements {
25 if let Some(href) = course_element.attr("href") {
26 all_courses
27 .entry(href.to_string())
28 .or_insert(course_element.inner_html());
29 }
30 }
31
32 let courses = all_courses
33 .into_iter()
34 .filter(|(_, v)| v.chars().take(5).all(|c| c.is_numeric()))
35 .map(|(id, title)| Course { title, id })
36 .collect::<Vec<Course>>();
37
38 Ok(courses)
39 }
40}