manaba_sdk/
course.rs

1use crate::error::Result;
2use crate::{Client, error::ManabaError};
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
16            .send()
17            .await
18            .map_err(ManabaError::SendRequestError)?;
19
20        let body = response
21            .text()
22            .await
23            .map_err(ManabaError::HtmlBodyParseError)?;
24
25        let document = Html::parse_document(&body);
26
27        let selector = Selector::parse("a[href^='course_']").unwrap();
28        let course_elements = document.select(&selector);
29
30        let mut all_courses = HashMap::new();
31        for course_element in course_elements {
32            if let Some(href) = course_element.attr("href") {
33                all_courses
34                    .entry(href.to_string())
35                    .or_insert(course_element.inner_html());
36            }
37        }
38
39        let courses = all_courses
40            .into_iter()
41            .filter(|(_, v)| v.chars().take(5).all(|c| c.is_numeric()))
42            .map(|(id, title)| Course { title, id })
43            .collect::<Vec<Course>>();
44
45        Ok(courses)
46    }
47}