use reqwest::Error;
use serde::{Deserialize, Serialize};
const BASE_URL: &str = "https://api.ipquery.io/";
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
pub struct ISPInfo {
pub asn: Option<String>,
pub org: Option<String>,
pub isp: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, PartialEq)]
pub struct LocationInfo {
pub country: Option<String>,
pub country_code: Option<String>,
pub city: Option<String>,
pub state: Option<String>,
pub zipcode: Option<String>,
pub latitude: Option<f64>,
pub longitude: Option<f64>,
pub timezone: Option<String>,
pub localtime: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
pub struct RiskInfo {
pub is_mobile: Option<bool>,
pub is_vpn: Option<bool>,
pub is_tor: Option<bool>,
pub is_proxy: Option<bool>,
pub is_datacenter: Option<bool>,
pub risk_score: Option<u8>,
}
#[derive(Debug, Deserialize, Serialize, PartialEq)]
pub struct IPInfo {
pub ip: String,
pub isp: Option<ISPInfo>,
pub location: Option<LocationInfo>,
pub risk: Option<RiskInfo>,
}
pub async fn query_ip(ip: &str) -> Result<IPInfo, Error> {
let url = format!("{}{}", BASE_URL, ip);
let response = reqwest::get(&url).await?.json::<IPInfo>().await?;
Ok(response)
}
pub async fn query_bulk(ips: &[&str]) -> Result<Vec<IPInfo>, Error> {
let ip_list = ips.join(",");
let url = format!("{}{}", BASE_URL, ip_list);
let response = reqwest::get(&url).await?.json::<Vec<IPInfo>>().await?;
Ok(response)
}
pub async fn query_own_ip() -> Result<String, Error> {
let response = reqwest::get(BASE_URL).await?.text().await?;
Ok(response)
}