algorithm_problem_client/codechef/
client.rs

1use crate::util;
2use crate::Result;
3
4use super::*;
5
6const CODECHEF_PREFIX: &str = "https://www.codechef.com/problems/";
7
8pub enum CodeChefProblemPage {
9    Beginner,
10    Easy,
11    Medium,
12    Hard,
13    Challenge,
14    Peer,
15}
16
17impl CodeChefProblemPage {
18    fn value(&self) -> &str {
19        match self {
20            CodeChefProblemPage::Beginner => "school",
21            CodeChefProblemPage::Easy => "easy",
22            CodeChefProblemPage::Medium => "medium",
23            CodeChefProblemPage::Hard => "hard",
24            CodeChefProblemPage::Challenge => "challenge",
25            CodeChefProblemPage::Peer => "extcontest",
26        }
27    }
28}
29
30pub struct CodeChefClient;
31
32impl Default for CodeChefClient {
33    fn default() -> Self {
34        Self
35    }
36}
37
38impl CodeChefClient {
39    pub async fn fetch_problem_list(
40        &self,
41        page: CodeChefProblemPage,
42    ) -> Result<Vec<CodeChefProblem>> {
43        let url = format!("{}{}", CODECHEF_PREFIX, page.value());
44        let html = util::get_html(&url).await?;
45        problem::scrape(&html)
46    }
47}
48
49#[cfg(test)]
50mod tests {
51    use super::*;
52    use futures::executor::block_on;
53
54    #[test]
55    fn test_fetch_problem_list() {
56        let client = CodeChefClient::default();
57        assert!(block_on(client.fetch_problem_list(CodeChefProblemPage::Beginner)).is_ok());
58        assert!(block_on(client.fetch_problem_list(CodeChefProblemPage::Easy)).is_ok());
59        assert!(block_on(client.fetch_problem_list(CodeChefProblemPage::Medium)).is_ok());
60        assert!(block_on(client.fetch_problem_list(CodeChefProblemPage::Hard)).is_ok());
61        assert!(block_on(client.fetch_problem_list(CodeChefProblemPage::Challenge)).is_ok());
62        assert!(block_on(client.fetch_problem_list(CodeChefProblemPage::Peer)).is_ok());
63    }
64}