WARNING: This is still very much a work in progress - this should probably/definitely NOT BE USED IN PRODUCTION.
This is my first Rust crate, so any suggestion about improvements, etc are very welcome.
Todos: - error handling - response status checks
reqwest = { version = "0.11.3", features = ["rustls", "json"] }
serde = { version = "1.0.125", features = ["derive"] }
Import the api client from the crate:
use maxmind_geo_ip2::ApiClient;
Initialize the client with Maxmind API credentials:
let maxmind_client = ApiClient.new_client(String::from("user_id_here"), String::from("license_key_here"));
API endpoint:
https://geoip.maxmind.com/geoip/v2.1/country/{ip_address}
Method signature:
rust
get_country(ip_address: String) -> Result<Response, Box<dyn std::error::Error>>
API endpoint:
https://geoip.maxmind.com/geoip/v2.1/city/{ip_address}
Method signature:
rust
get_city(ip_address: String) -> Result<Response, Box<dyn std::error::Error>>
API endpoint:
https://geoip.maxmind.com/geoip/v2.1/insights/{ip_address}
Method signature:
rust
get_insights(ip_address: String) -> Result<Response, Box<dyn std::error::Error>>
rust
pub struct Response {
city: Option<City>,
continent: Option<Continent>,
country: Option<Country>,
location: Option<Location>,
postal: Option<Postal>,
registered_country: Option<RegisteredCountry>,
represented_country: Option<RepresentedCountry>,
subdivisions: Option<Vec<Subdivision>>,
traits: Option<Traits>,
maxmind: Option<MaxMind>,
}
rust
pub struct City {
pub confidence: Option<i64>,
pub geoname_id: Option<i64>,
pub names: Option<HashMap<String, String>>,
}
rust
pub struct Continent {
pub code: Option<String>,
pub geoname_id: Option<i64>,
pub names: Option<HashMap<String, String>>,
}
rust
pub struct Country {
pub confidence: Option<i64>,
pub geoname_id: Option<i64>,
pub is_in_european_union: Option<bool>,
pub iso_code: Option<String>,
pub names: Option<HashMap<String, String>>,
}
rust
pub struct Location {
pub accuracy_radius: Option<i64>,
pub average_income: Option<i64>,
pub latitude: Option<f64>,
pub longitude: Option<f64>,
pub metro_code: Option<i64>,
pub population_density: Option<i64>,
pub time_zone: Option<String>,
}
rust
pub struct Postal {
pub code: Option<String>,
pub confidence: Option<i64>,
}
rust
pub struct RegisteredCountry {
pub geoname_id: Option<i64>,
pub is_in_european_union: Option<bool>,
pub iso_code: Option<String>,
pub names: Option<HashMap<String, String>>,
}
rust
pub struct RepresentedCountry {
pub geoname_id: Option<i64>,
pub iso_code: Option<String>,
pub names: Option<HashMap<String, String>>,
pub r#type: Option<String>,
}
rust
pub struct Subdivision {
pub confidence: Option<i64>,
pub geoname_id: Option<i64>,
pub iso_code: Option<String>,
pub names: Option<HashMap<String, String>>,
}
rust
pub struct Traits {
pub autonomous_system_number: Option<i64>,
pub autonomous_system_organization: Option<String>,
pub domain: Option<String>,
pub is_anonymous: Option<bool>,
pub is_anonymous_proxy: Option<bool>,
pub is_anonymous_vpn: Option<bool>,
pub is_hosting_provider: Option<bool>,
pub is_public_proxy: Option<bool>,
pub is_residential_proxy: Option<bool>,
pub is_satellite_provider: Option<bool>,
pub is_tor_exit_node: Option<bool>,
pub isp: Option<String>,
pub network: Option<String>,
pub ip_address: Option<String>,
pub organization: Option<String>,
pub static_ip_score: Option<f64>,
pub user_count: Option<i64>,
pub user_type: Option<String>,
}
rust
pub struct MaxMind {
pub queries_remaining: Option<i64>,
}