atcoder_util/gen/
problem.rs

1extern crate reqwest;
2extern crate scraper;
3
4use crate::gen::file_utils;
5use crate::sample_cases::SampleCases;
6use reqwest::Url;
7use scraper::Html;
8use std::io;
9
10/// Contains information of a problem in a contest.
11pub struct Problem<'a> {
12    pub contest_id: &'a str,
13    pub problem_id: &'a str,
14    pub sample_cases: SampleCases,
15}
16
17impl<'a> Problem<'a> {
18    /// Create a new instance.
19    pub fn new(contest_id: &'a str, problem_id: &'a str) -> Option<Problem<'a>> {
20        let sc = Problem::fetch_sample_cases(contest_id, problem_id);
21        if let Some(sc) = sc {
22            return Some(Problem {
23                contest_id,
24                problem_id,
25                sample_cases: sc,
26            });
27        }
28        None
29    }
30
31    /// Create `SampleCases` of a specific problem.
32    fn fetch_sample_cases(contest_id: &'a str, problem_id: &'a str) -> Option<SampleCases> {
33        let html = Problem::fetch_problem_html(contest_id, problem_id);
34        if let Some(html) = html {
35            let sc = SampleCases::new(&html);
36            return Some(sc);
37        }
38        None
39    }
40
41    /// Fetch `Html` of a problem.
42    fn fetch_problem_html(contest_id: &'a str, problem_id: &'a str) -> Option<Html> {
43        let problem_name = format!("{}_{}",contest_id.replace("-", "_"), problem_id);
44        let url = format!(
45            "https://atcoder.jp/contests/{}/tasks/{}",
46            contest_id, problem_name
47        );
48        let parsed_url = Url::parse(&url).unwrap();
49        let mut res = reqwest::get(parsed_url).unwrap();
50
51        if res.status().as_u16() == 200 {
52            let html_text = res.text().unwrap();
53            let document = Html::parse_document(&html_text);
54            return Some(document);
55        }
56        None
57    }
58
59    /// Create files which contains information of sample cases.
60    pub fn create_sample_cases_files(&self) -> Result<(), io::Error> {
61        file_utils::create_directory("io_examples".to_string())?;
62        file_utils::create_test_files(&self.sample_cases, self.problem_id)?;
63        Ok(())
64    }
65}