ipapi 0.1.0

A Rust library to query IP addresses using ipquery.io API
Documentation
# 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<IPInfo, reqwest::Error>
```

#### 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<Vec<IPInfo>, 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<IPInfo>)` 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<String, reqwest::Error>
```

#### 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.