This release includes significant API changes. See UPGRADING.md
for migration guidance.
Breaking Changes
Lookup API
lookup()now returnsLookupResultinstead ofOption<T>. The new API
enables lazy decoding - data is only deserialized when explicitly requested.lookup_prefix()has been removed. Uselookup(ip)?.network()instead.
Iteration API
within()now requires a secondWithinOptionsparameter. Use
Default::default()for the previous behavior.Withiniterator now yieldsLookupResultinstead ofWithinItem<T>.
GeoIP2 Structs
- The
namesfields now use aNamesstruct instead ofBTreeMap<&str, &str>.
Access names directly via language fields (e.g.,names.english). - Nested struct fields (
city,country,location, etc.) are now
non-optional withDefault, simplifying access patterns. - Removed
is_anonymous_proxyandis_satellite_providerfromTraits.
These fields are no longer present in MaxMind databases.
Error Types
InvalidDatabaseandDecodingvariants now use structured fields instead
of a single string. Pattern matching must be updated.- New
InvalidInputvariant for user input errors (e.g., IPv6 lookup in
IPv4-only database).
Memory Mapping
Reader::open_mmapis nowunsafe. The caller must ensure the database
file is not modified or truncated while theReaderexists. This fixes a
soundness issue. Reported by paolobarbolini. GitHub #86.
Added
LookupResulttype with lazy decoding support:has_data()- Check if data exists for this IPnetwork()- Get the network containing the IPoffset()- Get data offset for caching/deduplicationdecode()- Deserialize full recorddecode_path()- Selectively decode specific fields by path
PathElementenum andpath!macro for navigating nested structures.WithinOptionsto control network iteration behavior:include_aliased_networks()- Include IPv4 via IPv6 aliasesinclude_networks_without_data()- Include networks without data recordsskip_empty_values()- Skip empty maps/arrays
networks()method for iterating over all networks in the database.verify()method for comprehensive database validation.Metadata::build_time()to convertbuild_epochtoSystemTime.PartialEqandEqimplementations forMetadataandWithinOptions.
Changed
- Error messages now include byte offsets when available.
decode_path()errors include path context showing where navigation failed.- Added recursion depth limit (512) matching libmaxminddb and Go reader.
- Serde deserializer improvements: size hints,
is_human_readable()returns
false,deserialize_ignored_any, anddeserialize_enumsupport. MaxMindDbErroris now#[non_exhaustive].