gitpoap_rs/
lib.rs

1const ENDPOINT: &str = "https://public-api.gitpoap.io";
2pub mod response;
3pub mod status;
4pub mod v1 {
5    use super::response::*;
6    use super::status::*;
7    use super::ENDPOINT;
8    use cfg_if::cfg_if;
9    use std::error::Error;
10
11    cfg_if! {
12        if #[cfg(target_arch = "wasm32")] {
13            use gloo_net::http::Request;
14        }
15    }
16
17    pub fn get_base_url() -> String {
18        format!("{}/v1", ENDPOINT)
19    }
20
21    /// GET /v1/poap/:poapTokenId/is-gitpoap
22    /// This endpoint allows users to query whether some poapTokenId is a GitPOAP or not.
23    /// In the case that the poapTokenId corresponds to some claimed GitPOAP,
24    /// the API will return something like:
25    ///
26    /// # Example
27    ///
28    /// ```
29    /// use gitpoap_rs::v1::is_gitpoap;
30    /// #[tokio::main]
31    /// async fn main() {
32    ///     let poap_token_id = "4003";
33    ///     let response = is_gitpoap(poap_token_id).await;
34    ///     assert!(response.is_ok());
35    ///     let poap_response = response.unwrap();
36    ///     assert_eq!(poap_response.is_gitpoap, false);
37    /// }
38    /// ```
39    pub async fn is_gitpoap(poap_token_id: &str) -> Result<PoapResponse, Box<dyn Error>> {
40        let url = format!("{}/poap/{poap_token_id}/is-gitpoap", get_base_url());
41
42        cfg_if! {
43            if #[cfg(target_arch = "wasm32")] {
44                let response = Request::get(&url).send().await?;
45                let res = response.json::<PoapResponse>().await?;
46                Ok(res)
47            } else {
48                let response = reqwest::get(&url).await?;
49                let res = response.json::<PoapResponse>().await?;
50                Ok(res)
51            }
52        }
53    }
54
55    /// GET /v1/poap/gitpoap-ids
56    /// This endpoint retrieves all POAP token IDs that are recognized as GitPOAPs.
57    ///
58    /// # Example
59    ///
60    /// ```
61    /// use gitpoap_rs::v1::get_gitpoap_ids;
62    /// #[tokio::main]
63    /// async fn main() {
64    ///     let response = get_gitpoap_ids().await;
65    ///     assert!(response.is_ok());
66    ///     let poap_ids_response = response.unwrap();
67    ///     assert!(!poap_ids_response.poap_token_ids.is_empty());
68    /// }
69    /// ```
70    pub async fn get_gitpoap_ids() -> Result<PoapIdsResponse, Box<dyn Error>> {
71        let url = format!("{}/poap/gitpoap-ids", get_base_url());
72
73        cfg_if! {
74            if #[cfg(target_arch = "wasm32")] {
75                let response = Request::get(&url).send().await?;
76                let res = response.json::<PoapIdsResponse>().await?;
77                Ok(res)
78            } else {
79                let response = reqwest::get(&url).await?;
80                let res = response.json::<PoapIdsResponse>().await?;
81                Ok(res)
82            }
83        }
84    }
85
86    /// GET /v1/poap-event/:poapEventId/is-gitpoap
87    /// This endpoint checks whether a specific poapEventId is a GitPOAP event.
88    ///
89    /// # Example
90    ///
91    /// ```
92    /// use gitpoap_rs::v1::is_gitpoap_event;
93    /// #[tokio::main]
94    /// async fn main() {
95    ///     let poap_event_id = "12345";
96    ///     let response = is_gitpoap_event(poap_event_id).await;
97    ///     assert!(response.is_ok());
98    ///     let event_response = response.unwrap();
99    ///     assert_eq!(event_response.is_gitpoap, false);
100    /// }
101    /// ```
102    pub async fn is_gitpoap_event(poap_event_id: &str) -> Result<EventResponse, Box<dyn Error>> {
103        let url = format!("{}/poap-event/{poap_event_id}/is-gitpoap", get_base_url());
104
105        cfg_if! {
106            if #[cfg(target_arch = "wasm32")] {
107                let response = Request::get(&url).send().await?;
108                let res = response.json::<EventResponse>().await?;
109                Ok(res)
110            } else {
111                let response = reqwest::get(&url).await?;
112                let res = response.json::<EventResponse>().await?;
113                Ok(res)
114            }
115        }
116    }
117
118    /// GET /v1/github/user/:githubHandle/gitpoaps?status=<status>
119    /// This endpoint allows users to query for minted GitPOAPs associated with
120    /// a specified GitHub handle.
121    /// The status query parameter is one of the following:
122    /// claimed, unclaimed, pending, minting, and can be omitted completely.
123    /// This returns data like:
124    /// ```
125    /// use gitpoap_rs::v1::get_gitpoaps_for_github_user;
126    /// #[tokio::main]
127    /// async fn main() {
128    ///     let github_handle = "woxjro";
129    ///     let response = get_gitpoaps_for_github_user(github_handle, None).await;
130    ///     assert!(response.is_ok());
131    ///     let gitpoaps_response = response.unwrap();
132    ///     assert_eq!(gitpoaps_response.0.is_empty(), false);
133    /// }
134    /// ```
135    pub async fn get_gitpoaps_for_github_user(
136        github_handle: &str,
137        status: Option<Status>,
138    ) -> Result<GitpoapsResponse, Box<dyn Error>> {
139        let url = format!(
140            "{}/github/user/{github_handle}/gitpoaps?status={status}",
141            get_base_url(),
142            status = status.unwrap_or(Status::Claimed).to_string()
143        );
144
145        cfg_if! {
146            if #[cfg(target_arch = "wasm32")] {
147                let response = Request::get(&url).send().await?;
148                let res = response.json::<GitpoapsResponse>().await?;
149                Ok(res)
150            } else {
151                let response = reqwest::get(&url).await?;
152                let res = response.json::<GitpoapsResponse>().await?;
153                Ok(res)
154            }
155        }
156    }
157
158    #[cfg(test)]
159    mod tests {
160        use super::*;
161
162        #[test]
163        fn test_deserialize_gitpoap_response() {
164            let json = r#"{"isGitPOAP":true,"gitPOAPId":4003}"#;
165            let response: PoapResponse = serde_json::from_str(json).unwrap();
166            assert!(response.is_gitpoap);
167            assert_eq!(response.gitpoap_id.unwrap(), 4003);
168        }
169
170        #[tokio::test]
171        async fn test_is_gitpoap() {
172            let poap_token_id = "4003";
173            let response = is_gitpoap(poap_token_id).await;
174            assert!(response.is_ok());
175            let poap_response = response.unwrap();
176            assert!(!poap_response.is_gitpoap);
177        }
178
179        #[tokio::test]
180        async fn test_get_gitpoap_ids() {
181            let response = get_gitpoap_ids().await;
182            assert!(response.is_ok());
183            let poap_ids_response = response.unwrap();
184            assert!(!poap_ids_response.poap_token_ids.is_empty());
185        }
186
187        #[tokio::test]
188        async fn test_is_gitpoap_event() {
189            let poap_event_id = "166421";
190            let response = is_gitpoap_event(poap_event_id).await;
191            assert!(response.is_ok());
192            let event_response = response.unwrap();
193            assert!(event_response.is_gitpoap);
194        }
195
196        #[tokio::test]
197        async fn test_get_gitpoaps_for_github_user() {
198            let github_handle = "octocat";
199            let response = get_gitpoaps_for_github_user(github_handle, None).await;
200            assert!(response.is_ok());
201            let gitpoaps_response = response.unwrap();
202            assert!(gitpoaps_response.0.is_empty());
203        }
204    }
205} /* v1 */