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
use crate::util::{HttpClient, Problem}; use crate::Result; use serde::Deserialize; const BASE_URL: &str = "https://yukicoder.me/api/v1"; pub struct YukicoderClient { http_client: HttpClient, } impl Default for YukicoderClient { fn default() -> Self { Self { http_client: HttpClient::default(), } } } impl YukicoderClient { pub fn fetch_problems(&self) -> Result<Vec<YukicoderProblem>> { let url = format!("{}/problems", BASE_URL); self.http_client.get_json(&url) } } #[derive(Debug, PartialEq, PartialOrd, Ord, Eq, Deserialize)] pub struct YukicoderProblem { #[serde(rename = "No")] number: u32, #[serde(rename = "ProblemId")] id: u32, #[serde(rename = "Title")] title: String, } impl Problem for YukicoderProblem { fn url(&self) -> String { format!("https://yukicoder.me/problems/no/{}", self.number) } } #[cfg(test)] mod tests { use super::*; #[test] fn test_fetch_problems() { let client = YukicoderClient::default(); assert!(client.fetch_problems().is_ok()); } }