1use std::sync::Arc;
4use reqwest::Client;
5use crate::error::IpbaseError;
6use crate::{error, models, utils};
7use crate::utils::baseline::construct_base_url;
8
9#[derive(Debug, Clone)]
11pub struct Settings {
12 api_key: String,
13}
14
15#[derive(Debug, Clone)]
18pub struct Ipbase {
19 client: Client,
20 settings: Arc<Settings>,
21}
22
23impl<'a> Ipbase {
24 pub fn new(api_key: &'a str) -> Result<Self, IpbaseError> {
27 let settings = std::sync::Arc::new(Settings {
28 api_key: String::from(api_key),
29 });
30 let client = utils::baseline::construct_client(None, &settings)?;
31 Ok(Self { client, settings })
32 }
33
34 pub async fn status(
35 &self,
36 ) -> Result<models::DetailsResponse, error::IpbaseError> {
37 let mut url = construct_base_url(&self.settings.api_key, Some("status"))?;
38 let res_body = self
39 .client
40 .get(url)
41 .send()
42 .await
43 .map_err(|err| error::IpbaseError::RequestError { source: err })?
44 .text()
45 .await
46 .map_err(|err| error::IpbaseError::RequestError { source: err })?;
47 serde_json::from_str::<models::DetailsResponse>(&res_body)
48 .map_err(|_| error::IpbaseError::ResponseParsingError { body: res_body })
49 }
50
51 pub async fn info(
52 &self,
53 ip: &'a str,
54 language: &'a str,
55 ) -> Result<models::DetailsResponse, error::IpbaseError> {
56 let mut url = construct_base_url(&self.settings.api_key, Some("latest"))?;
57 url.query_pairs_mut()
58 .append_pair("ip", ip)
59 .append_pair("language", language);
60 let res_body = self
61 .client
62 .get(url)
63 .send()
64 .await
65 .map_err(|err| error::IpbaseError::RequestError { source: err })?
66 .text()
67 .await
68 .map_err(|err| error::IpbaseError::RequestError { source: err })?;
69 serde_json::from_str::<models::DetailsResponse>(&res_body)
70 .map_err(|_| error::IpbaseError::ResponseParsingError { body: res_body })
71 }
72}