use crate::assignment::{AssignmentDate, AssignmentState};
use crate::error::Result;
use crate::{Client, Course};
use scraper::Selector;
#[derive(Debug)]
pub struct Report {
pub title: String,
pub state: AssignmentState,
pub start_date: Option<AssignmentDate>,
pub due_date: Option<AssignmentDate>,
}
impl Client {
pub async fn get_reports(&self, course: &Course) -> Result<Vec<Report>> {
let url = format!("{}_report", course.id);
let html = self.get_html(reqwest::Method::GET, url).await?;
let selector = Selector::parse("table.stdlist tr:not(.title)").unwrap();
let reports_element = html.select(&selector);
let reports = reports_element
.map(|report_element| {
let selector = Selector::parse("td").unwrap();
let mut rows = report_element.select(&selector);
let title = {
let row = rows.next().unwrap();
let selector = Selector::parse("a").unwrap();
let report_title_element = row.select(&selector).next().unwrap();
report_title_element.inner_html()
};
let state = {
let row = rows.next().unwrap();
let selector = Selector::parse("strong").unwrap();
if row.select(&selector).next().is_some() {
AssignmentState::Done
} else {
AssignmentState::Todo
}
};
let start_date = {
let row = rows.next().unwrap();
let date = row.inner_html();
if date.is_empty() {
None
} else {
Some(AssignmentDate::new(&date))
}
};
let due_date = {
let row = rows.next().unwrap();
let date = row.inner_html();
if date.is_empty() {
None
} else {
Some(AssignmentDate::new(&date))
}
};
Report {
title,
state,
start_date,
due_date,
}
})
.collect::<Vec<Report>>();
Ok(reports)
}
}