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