atcoder_util/gen/
problem.rs1extern 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
10pub 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 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 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 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 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}