osu_api/api_v1/
api.rs

1use super::models;
2
3use paste::paste;
4
5/// Generate constant endpoint
6macro_rules! generate_endpoint {
7  ($($ep:ident;)+) => {
8    paste!{
9      pub struct ApiEndpoint;
10      impl ApiEndpoint {
11        $(
12          pub const [<$ep:upper>]: &'static str = concat!("https://osu.ppy.sh/api/", stringify!($ep));
13        )+
14      }
15    }
16  };
17}
18
19generate_endpoint! {
20  get_beatmaps;
21  get_user;
22  get_scores;
23  get_user_best;
24  get_user_recent;
25}
26
27#[async_trait::async_trait]
28pub trait OsuApiRequester {
29  async fn get_user_recent<'k, 'u>(
30    &self,
31    param: models::GetUserRecentProp<'k, 'u>,
32  ) -> Result<Vec<models::GetUserRecentResp>, Error>;
33
34  async fn get_beatmaps<'u, 'k>(
35    &self,
36    param: models::GetBeatmapsProps<'u, 'k>,
37  ) -> Result<Vec<models::GetBeatmapsResp>, Error>;
38}
39
40#[derive(thiserror::Error, Debug)]
41pub enum Error {
42  #[error("the given request param is invalid")]
43  InvalidRequestParams,
44  #[error("fail to send request")]
45  NetIO(#[from] reqwest::Error),
46  #[error("fail to deserialize response into expected type")]
47  UnexpectedResponse(#[from] serde_json::Error),
48}