use std::error::Error;
use std::net::IpAddr;
use libmaxminddb_rs::{MetadataBuilder, MmdbDecode, MmdbEncode, Reader, Writer};
#[derive(Debug, PartialEq, MmdbEncode, MmdbDecode)]
struct CityRecord<'a> {
country: &'a str,
city: &'a str,
postal_code: Option<&'a str>,
latitude: f64,
longitude: f64,
}
fn main() -> Result<(), Box<dyn Error>> {
println!("=== libmaxminddb-rs Quickstart Example ===\n");
println!("1. Initializing database metadata...");
let metadata = MetadataBuilder::new()
.database_type("Quickstart-City-DB")
.ip_version(4)
.language("en")
.language("fr")
.description("en", "Quickstart geolocation example database")
.description("fr", "Exemple de base de données de géolocalisation")
.build()?;
let mut writer = Writer::with_metadata(metadata);
println!("2. Inserting IP ranges...");
writer.insert_encoded(
"203.0.113.0/24".parse()?,
&CityRecord {
country: "FR",
city: "Paris",
postal_code: Some("75001"),
latitude: 48.8566,
longitude: 2.3522,
},
)?;
writer.insert_encoded(
"198.51.100.0/24".parse()?,
&CityRecord {
country: "JP",
city: "Tokyo",
postal_code: Some("100-0001"),
latitude: 35.6762,
longitude: 139.6503,
},
)?;
let mmdb_bytes: Vec<u8> = writer.finish()?;
println!(
" Database generated in memory (size: {} bytes).\n",
mmdb_bytes.len()
);
println!("3. Opening database with Reader...");
let reader = Reader::from_bytes(&mmdb_bytes)?;
println!("4. Performing lookups:\n");
let test_ips: &[(&str, &str)] = &[
("203.0.113.42", "Paris, France subnet"),
("198.51.100.10", "Tokyo, Japan subnet"),
];
for &(ip_str, note) in test_ips {
let ip: IpAddr = ip_str.parse()?;
let record: CityRecord<'_> = reader.lookup_borrowed(ip)?;
println!(" IP: {} ({})", ip, note);
println!(" ↳ Country : {}", record.country);
println!(" ↳ City : {}", record.city);
println!(" ↳ Postal Code : {:?}", record.postal_code);
println!(
" ↳ Coordinates : ({:.4}, {:.4})\n",
record.latitude, record.longitude
);
}
let unmapped_ip: IpAddr = "192.0.2.1".parse()?;
match reader.lookup_value(unmapped_ip) {
Ok(value) => println!(" Unexpected record for {}: {:?}", unmapped_ip, value),
Err(err) => println!(
"5. Looked up unmapped IP {} -> Expected error: {}\n",
unmapped_ip, err
),
}
println!("Quickstart example completed successfully!");
Ok(())
}