manaba_sdk/
course.rs

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(
14            reqwest::Method::GET,
15            format!("{}/home_course", self.base_url),
16        );
17
18        let response = request.send().await?;
19        let body = response.text().await?;
20
21        let document = Html::parse_document(&body);
22
23        let selector = Selector::parse("a[href^='course_']").unwrap();
24        let course_elements = document.select(&selector);
25
26        let mut all_courses = HashMap::new();
27        for course_element in course_elements {
28            if let Some(href) = course_element.attr("href") {
29                all_courses
30                    .entry(href.to_string())
31                    .or_insert(course_element.inner_html());
32            }
33        }
34
35        let courses = all_courses
36            .into_iter()
37            .filter(|(_, v)| v.chars().take(5).all(|c| c.is_numeric()))
38            .map(|(id, title)| Course { title, id })
39            .collect::<Vec<Course>>();
40
41        Ok(courses)
42    }
43}