use std::error::Error;
use std::net::IpAddr;
use libmaxminddb_rs::{MetadataBuilder, MmdbDecode, MmdbEncode, Reader, ValueRef, Writer};
#[derive(Debug, PartialEq, MmdbEncode, MmdbDecode)]
struct IpIntelligence<'a> {
asn: u32,
org: &'a str,
country_iso: &'a str,
threat_category: Option<&'a str>,
is_anonymous_proxy: bool,
}
fn main() -> Result<(), Box<dyn Error>> {
println!("=== libmaxminddb-rs Zero-Copy Lookup Example ===\n");
let metadata = MetadataBuilder::new()
.database_type("Zero-Copy-Intel-DB")
.ip_version(4)
.description(
"en",
"IP intelligence database demonstrating zero-copy decoding",
)
.build()?;
let mut writer = Writer::with_metadata(metadata);
writer.insert_encoded(
"198.51.100.0/24".parse()?,
&IpIntelligence {
asn: 64512,
org: "Documentation Reserved AS",
country_iso: "US",
threat_category: Some("datacenter"),
is_anonymous_proxy: false,
},
)?;
writer.insert_encoded(
"203.0.113.128/25".parse()?,
&IpIntelligence {
asn: 64513,
org: "Test Threat Network Inc.",
country_iso: "NL",
threat_category: Some("tor_exit_node"),
is_anonymous_proxy: true,
},
)?;
let database_bytes = writer.finish()?;
println!(
"1. Database prepared in memory ({} bytes).\n",
database_bytes.len()
);
let reader = Reader::from_bytes(&database_bytes)?;
let target_ip: IpAddr = "203.0.113.199".parse()?;
println!(
"2. Performing zero-copy borrowed lookup for IP: {}",
target_ip
);
let intel: IpIntelligence<'_> = reader.lookup_borrowed(target_ip)?;
println!(" ASN : AS{}", intel.asn);
println!(" Organization : {}", intel.org);
println!(" Country : {}", intel.country_iso);
println!(" Threat : {:?}", intel.threat_category);
println!(" Proxy Flag : {}", intel.is_anonymous_proxy);
let missing_ip: IpAddr = "192.0.2.1".parse()?;
let missing: Option<IpIntelligence<'_>> = reader.lookup_borrowed_opt(missing_ip);
println!(" Optional lookup missed: {}", missing.is_none());
let generic_value = reader.lookup_value(target_ip)?;
let Some(ValueRef::Uint32(asn)) = generic_value.get("asn") else {
return Err("expected a u32 asn field".into());
};
let Some(ValueRef::Utf8(org)) = generic_value.get("org") else {
return Err("expected a string org field".into());
};
let Some(ValueRef::Utf8(country_iso)) = generic_value.get("country_iso") else {
return Err("expected a string country_iso field".into());
};
let threat_category = match generic_value.get("threat_category") {
Some(ValueRef::Utf8(category)) => Some(*category),
None => None, _ => return Err("expected a string threat_category field".into()),
};
let Some(ValueRef::Bool(is_anonymous_proxy)) = generic_value.get("is_anonymous_proxy") else {
return Err("expected a boolean is_anonymous_proxy field".into());
};
println!(" ValueRef ASN : AS{asn}");
println!(" ValueRef Organization : {org}");
println!(" ValueRef Country : {country_iso}");
println!(" ValueRef Threat : {threat_category:?}");
println!(" ValueRef Proxy Flag : {is_anonymous_proxy}");
assert_eq!(*asn, intel.asn);
assert_eq!(*org, intel.org);
assert_eq!(*country_iso, intel.country_iso);
assert_eq!(threat_category, intel.threat_category);
assert_eq!(*is_anonymous_proxy, intel.is_anonymous_proxy);
println!("\n3. Inspecting subnet prefix length:");
let (value_ref, prefix_len) = reader.lookup_value_with_prefix(target_ip)?;
println!(" Matched subnet prefix: /{}\n", prefix_len);
if let Some(ValueRef::Utf8(country_iso)) = value_ref.get("country_iso") {
println!(" Country from prefixed lookup: {country_iso}");
}
if let ValueRef::Map(entries) = value_ref {
println!("4. Dynamic traversal of borrowed map entries:");
for (key, val) in entries {
println!(" ↳ Key: {:<18} | Value: {:?}", key, val);
}
}
println!("\nZero-copy lookup example completed successfully!");
Ok(())
}