algorithm_problem_client/aoj/
client.rs

1use 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}