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