1use super::models;
2
3use paste::paste;
4
5macro_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}