manaba_sdk/scrape/
course.rs

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