algorithm_problem_client/aoj/
client.rs1use super::*;
2
3use crate::util;
4use crate::Result;
5
6const AOJ_ENDPOINT: &str = "https://judgeapi.u-aizu.ac.jp";
7
8pub struct AojClient;
9
10impl Default for AojClient {
11 fn default() -> Self {
12 Self
13 }
14}
15
16impl AojClient {
17 pub async fn fetch_problems(&self, page: u32, size: u32) -> Result<Vec<AojProblem>> {
18 util::get_json(&format!(
19 "{}/problems?page={}&size={}",
20 AOJ_ENDPOINT, page, size
21 ))
22 .await
23 }
24
25 pub async fn fetch_user_ranking(&self, page: u32, size: u32) -> Result<AojUserRanking> {
26 util::get_json(&format!(
27 "{}/users/ranking/solved?page={}&size={}",
28 AOJ_ENDPOINT, page, size
29 ))
30 .await
31 }
32
33 pub async fn fetch_user_info(&self, user_id: &str) -> Result<AojUserInfo> {
34 util::get_json(&format!("{}/users/{}", AOJ_ENDPOINT, user_id)).await
35 }
36
37 pub async fn fetch_solutions(
38 &self,
39 user_id: &str,
40 page: u32,
41 size: u32,
42 ) -> Result<Vec<AojSolution>> {
43 util::get_json(&format!(
44 "{endpoint}/solutions/users/{user_id}?page={page}&size={size} ",
45 endpoint = AOJ_ENDPOINT,
46 user_id = user_id,
47 page = page,
48 size = size
49 ))
50 .await
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57 use futures::executor::block_on;
58
59 #[test]
60 fn problems() {
61 let client = AojClient::default();
62 let problems = block_on(client.fetch_problems(1, 100)).unwrap();
63 assert_eq!(problems.len(), 100);
64 }
65
66 #[test]
67 fn test_users() {
68 let client = AojClient::default();
69 let users = block_on(client.fetch_user_ranking(0, 10)).unwrap();
70 assert_eq!(users.users.len(), 10);
71
72 let page = (users.total_user_count - 1) / 10;
73 let count = (users.total_user_count - 1) % 10;
74 let users = block_on(client.fetch_user_ranking(page, 10)).unwrap();
75 assert_eq!(users.users.len(), count as usize);
76 }
77
78 #[test]
79 fn test_find_user() {
80 let client = AojClient::default();
81 let user = block_on(client.fetch_user_info("kenkoooo"));
82 assert!(user.is_ok());
83
84 let user = block_on(client.fetch_user_info("kenkxxxx"));
85 assert!(user.is_err());
86 }
87
88 #[test]
89 fn test_solutions() {
90 let client = AojClient::default();
91 let solutions = block_on(client.fetch_solutions("kenkoooo", 0, 100)).unwrap();
92 assert_eq!(solutions.len(), 100);
93 }
94}