# ipapi A Rust library to query IP addresses using the [ipquery.io](https://ipquery.io) API. ## Features - Query details for a specific IP address - Bulk query multiple IP addresses - Fetch your own public IP address ## Installation To use this crate, add the following to your `Cargo.toml`: ```toml [dependencies] ipapi = "0.1.0" tokio = { version = "1.0", features = ["full"] } ``` ## Usage ### Query a Specific IP Address The `query_ip` function retrieves information about a specific IP address, including its ISP, location, and risk data. ```rust use ipapi::query_ip; use tokio; #[tokio::main] async fn main() { let ip_info = query_ip("8.8.8.8").await.unwrap(); println!("{:#?}", ip_info); } ``` #### Output Example ```plaintext IPInfo { ip: "8.8.8.8", isp: Some(ISPInfo { asn: Some("AS15169"), org: Some("Google LLC"), isp: Some("Google LLC") }), location: Some(LocationInfo { country: Some("United States"), country_code: Some("US"), city: Some("Mountain View"), state: Some("California"), zipcode: Some("94035"), latitude: Some(37.386), longitude: Some(-122.0838), timezone: Some("America/Los_Angeles"), localtime: Some("2024-11-09T12:45:32"), }), risk: Some(RiskInfo { is_mobile: Some(false), is_vpn: Some(false), is_tor: Some(false), is_proxy: Some(false), is_datacenter: Some(true), risk_score: Some(0), }), } ``` ### Bulk Query Multiple IP Addresses The `query_bulk` function allows you to query information for multiple IP addresses at once. ```rust use ipapi::query_bulk; use tokio; #[tokio::main] async fn main() { let ip_infos = query_bulk(&["8.8.8.8", "1.1.1.1"]).await.unwrap(); for info in ip_infos { println!("{:#?}", info); } } ``` #### Output Example ```plaintext IPInfo { ip: "8.8.8.8", ... } IPInfo { ip: "1.1.1.1", ... } ``` ### Fetch Your Own Public IP Address The `query_own_ip` function retrieves the public IP address of the current machine. ```rust use ipapi::query_own_ip; use tokio; #[tokio::main] async fn main() { let ip = query_own_ip().await.unwrap(); println!("Your IP Address: {}", ip); } ``` #### Output Example ```plaintext Your IP Address: 203.0.113.45 ``` ## API Documentation ### 1. `query_ip` #### Signature ```rust pub async fn query_ip(ip: &str) -> Result ``` #### Description Fetches detailed information about a specific IP address, including its ISP, location, and risk information. #### Parameters - `ip`: A string slice representing the IP address to query. #### Returns - `Ok(IPInfo)` on success, containing details about the IP address. - `Err(reqwest::Error)` if the network request or JSON deserialization fails. #### Example ```rust let result = query_ip("8.8.8.8").await?; println!("{:?}", result); ``` --- ### 2. `query_bulk` #### Signature ```rust pub async fn query_bulk(ips: &[&str]) -> Result, reqwest::Error> ``` #### Description Fetches information for multiple IP addresses at once. Useful for batch processing. #### Parameters - `ips`: A slice of string slices representing the list of IP addresses to query. #### Returns - `Ok(Vec)` on success, containing details for each IP address. - `Err(reqwest::Error)` if the network request or JSON deserialization fails. #### Example ```rust let ips = ["8.8.8.8", "1.1.1.1"]; let results = query_bulk(&ips).await?; println!("{:?}", results); ``` --- ### 3. `query_own_ip` #### Signature ```rust pub async fn query_own_ip() -> Result ``` #### Description Fetches the public IP address of the current machine. Useful for determining your own IP address. #### Returns - `Ok(String)` containing the public IP address. - `Err(reqwest::Error)` if the network request fails. #### Example ```rust let ip = query_own_ip().await?; println!("Your IP Address: {}", ip); ``` --- ## Running Tests To run the tests for this crate: ```bash cargo test ``` ## Contributing Contributions are welcome! Feel free to open issues or submit pull requests on the [GitHub repository](https://github.com/ipqwery/ipapi). ## License This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.