algorithm_problem_client/codechef/
client.rs1use 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}